C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了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 %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 **的事实

解决方法@H_874_33@
函数参数可以通过值或引用传递.在引用的情况下,没有顶级限定符,因此我们可以忽略该情况.

对于按值参数,顶级限定符仅影响副本,并且完全独立于用于复制构造该参数的原始值.如果未从签名中删除顶级限定符,则以下两个函数将是有效且不同的重载:

void f(int       i);
void f(int const i);

现在的问题是,在调用f(1)时应该选择哪两个重载?这里的问题是参数是否为const不会影响它的构造,因此编译器永远无法解析哪个是正确的重载.解决方案很简单:在签名中,顶级限定符被删除,两者都是相同的函数.

大佬总结

以上是大佬教程为你收集整理的C抱怨将char **值传递给函数,取char const * const * const但C却没有全部内容,希望文章能够帮你解决C抱怨将char **值传递给函数,取char const * const * const但C却没有所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。