【发布时间】:2013-12-19 23:20:11
【问题描述】:
在解释和创建函数参数的类型时,我很难理解为什么 C++ 比 C 表现得更“宽松”。
C 做了世界上最简单的事情,它坚持你所写的,仅此而已,另一方面,C++ 以一种我无法真正理解的扭曲方式运行。
例如,流行的argv 是char* [],当传递给函数时变成char**,我真的不明白为什么,我期望和“想要”的是char * const *,但我得到了这种行为而是。
您也可以阅读this article in PDF 讨论C 和C++ 之间的这种差异,文章也以这句话结尾:
尽管 C++ 忽略了参数中的顶级 cv 限定符 确定函数签名时的声明,它不 完全忽略那些 cv 限定符。
由于我在网上找不到这个问题(嵌入式系统编程 - 2000 年 2 月,而且这个旧问题是免费的),我想知道这句话可能意味着什么。
有人可以解释为什么这种行为在 C++ 中是这样的吗?
编辑:
我的一个例子是
#include <stdio.h>
void foo(int argc, const char *const *const argv) {
printf("%d %s\n", argc, argv[0]);
}
int main(int argc, char *argv[]) {
foo(argc, argv);
return (0);
}
如果你用 gcc 4.8.1 编译它,你会得到预期的错误
gcc cv_1.c
cv_1.c: In function ‘main’:
cv_1.c:8:3: warning: passing argument 2 of ‘foo’ from incompatible pointer type [enabled by default]
foo(argc, argv);
^
cv_1.c:3:6: note: expected ‘const char * const* const’ but argument is of type ‘char **’
void foo(int argc, const char *const *const argv) {
^
这个输出隐含了argv被解释为char**的事实
【问题讨论】:
-
您的 argv 示例实际上是 C++ 从 C 继承而来的。您的 PDF 讨论了 签名,它们仅对重载决议很重要。与简历检查无关。
-
@HansPassant 对于我所关心的,如果它存在于顶层,这个机制仍然会丢弃我的
const,我想知道这种奇怪行为背后的基本原理是什么。argv在这个例子中只是一个玩具。 -
请用一个具体的例子来幽默我们。
-
@user2485710:在这方面,C 和 C++ 之间绝对没有区别。在这两种语言中,顶级 cv 限定符对函数签名没有影响。在这两种语言中,
char *[]在函数参数声明中变为char **。你是从哪里得到有任何想法的? -
@user2485710:哦,我明白了,链接的 PDF 文章中说...那篇文章绝对不正确。
标签: c++ c constants volatile qualifiers