当函数参数与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;
}