当函数参数与c中的const参数声明不匹配时编译的程序
Posted
技术标签:
【中文标题】当函数参数与c中的const参数声明不匹配时编译的程序【英文标题】:program compiled when function parameter does not match the const parameter declaration in c 【发布时间】:2022-01-18 23:26:03 【问题描述】:我有一段这样的代码:
#include <stdio.h>
int add(const int x, const int y);
int main()
printf("%d", add(9, 8));
return 0;
int add(int x, int y)
return x + y;
我用 const 参数向前声明了函数“add”,之后我在没有 const 参数的情况下定义了它,当我编译它时,编译器没有任何抱怨。 程序的输出是: 17. 为什么会这样?
【问题讨论】:
MSVC 说 警告 C4028:形式参数 1 与声明不同 和参数 2。调高警告级别? 你编译这个时所有警告都打开了吗? 我用 gcc -Wall -o test test.c 编译它,没有任何反应 我的意思是无论参数是否为const
,它都不是原型的一部分;无论如何它都会被抹去。它仅在功能块本身中很重要。所以它被忽略了。 如,int a(const int foo);
与int a(int);
相同。
如果有什么相反的意义。 声明 int add(int x, int y);
和定义 int add(const int x, const int y) ...
。 const
在声明中没有任何作用,没有它,可以减少混乱。作为定义的一部分,确保以下代码中的值不会更改很有用。
【参考方案1】:
嗯,函数声明和函数定义必须是compatible,我们都知道。所以相同的名称和相同的返回类型和参数类型。所以我们从C11 6.7.6.3p15知道:
为了使两个函数类型兼容,[...] 对应的参数应该具有兼容的类型。 [...]
但是,后面有一个明确的后门:
(在确定类型兼容性时 [...] 使用限定类型声明的每个参数都被视为具有其声明类型的非限定版本。)
type-qualifier 是例如 const
。它被忽略了。您可以放置任何类型限定符,并且在检查函数声明是否彼此相同时将其忽略。
int func(int n);
int func(volatile int n);
int func(const int n);
int func(const volatile int n);
int func(int n)
return n;
【讨论】:
有趣。那么 MSVC 会产生一个不相关的警告吗? @tstanisl 我不认为警告是无关紧要的。即使行为被标准很好地定义,声明和定义之间的差异至少是可疑的并且可能是无意的。 (程序员可能忘记在定义中添加限定符。)以上是关于当函数参数与c中的const参数声明不匹配时编译的程序的主要内容,如果未能解决你的问题,请参考以下文章
MFC CFileDialog派生类在编译过程出现“error 没有与参数列表匹配的构造函数......”的问题