C抱怨将char **值传递给函数,取char const * const * const但C却
在解释和创建函数参数的类型时,我很难理解为什么C在比C更“放松”的方式下表现.
C做世界上最简单的事情,它坚持你写的东西,就是这样,C另一方面以扭曲的方式运作,我无法理解. 例如,当传递给函数时,流行的argv是char * []当变成char **而我真的不明白为什么,我期望和“想要”的是char * const *但是我得到了这种行为. 您还可以阅读介绍C和C之间差异的this article in PDF,文章也以这句话结尾:
因为我在网上找不到这个问题(嵌入式系统编程 – 2000年2月,这个老问题是免费的),我想知道这句话可能意味着什么. 有人可以解释为什么这种行为是它在C中的方式? 编辑: 我的一个例子是 #include <stdio.h> void foo(int argc,const char *const *const argv) { printf("%d %sn",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 **的事实 解决方法
函数参数可以通过值或引用传递.在引用的情况下,没有顶级限定符,因此我们可以忽略该情况.
对于按值参数,顶级限定符仅影响副本,并且完全独立于用于复制构造该参数的原始值.如果未从签名中删除顶级限定符,则以下两个函数将是有效且不同的重载: void f(int i); void f(int const i); 现在的问题是,在调用f(1)时应该选择哪两个重载?这里的问题是参数是否为const不会影响它的构造,因此编译器永远无法解析哪个是正确的重载.解决方案很简单:在签名中,顶级限定符被删除,两者都是相同的函数. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |