当函数参数与c中的const参数声明不匹配时编译的程序
program compiled when function parameter does not match the const parameter declaration in c
我有一段代码是这样的:
#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. 为什么会这样?
嗯,函数声明和函数定义必须是compatible, we all know that. So the same name and same return type and type of parameters. So we know from C11 6.7.6.3p15:
For two function types to be compatible, [...] corresponding parameters shall have compatible types. [...]
但是,有一个明确的后门,在该文本的后面:
(In the determination of type compatibility [...] each parameter declared with qualified type is taken as having the unqualified version of its declared type.)
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;
}
我有一段代码是这样的:
#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. 为什么会这样?
嗯,函数声明和函数定义必须是compatible, we all know that. So the same name and same return type and type of parameters. So we know from C11 6.7.6.3p15:
For two function types to be compatible, [...] corresponding parameters shall have compatible types. [...]
但是,有一个明确的后门,在该文本的后面:
(In the determination of type compatibility [...] each parameter declared with qualified type is taken as having the unqualified version of its declared type.)
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;
}