加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C抱怨将char **值传递给函数,取char const * const * const但C却

发布时间:2020-12-16 10:44:02 所属栏目:百科 来源:网络整理
导读:在解释和创建函数参数的类型时,我很难理解为什么C在比C更“放松”的方式下表现. C做世界上最简单的事情,它坚持你写的东西,就是这样,C另一方面以扭曲的方式运作,我无法理解. 例如,当传递给函数时,流行的argv是char * []当变成char **而我真的不明白为什么,我
在解释和创建函数参数的类型时,我很难理解为什么C在比C更“放松”的方式下表现.

C做世界上最简单的事情,它坚持你写的东西,就是这样,C另一方面以扭曲的方式运作,我无法理解.

例如,当传递给函数时,流行的argv是char * []当变成char **而我真的不明白为什么,我期望和“想要”的是char * const *但是我得到了这种行为.

您还可以阅读介绍C和C之间差异的this article in PDF,文章也以这句话结尾:

Although C++ ignores top-level cv-qualifiers in parameter
declarations when determining function signatures,it does not
ignore those cv-qualifiers entirely.

因为我在网上找不到这个问题(嵌入式系统编程 – 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不会影响它的构造,因此编译器永远无法解析哪个是正确的重载.解决方案很简单:在签名中,顶级限定符被删除,两者都是相同的函数.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读