我在code.h
中声明了一个函数,并在code.c
中实现。
它就像:
void someFunc(const char*);
和
#include "code.h"
void someFunc(const char* str){ printf("%s\n", str); }
现在我发现我可以删除文件的任何一个中的const
(将其保留在另一个文件中)并编译&运行没有错误。
我想知道这是什么意思?
其中一个文件是唯一重要的文件吗?
这可能听起来只是一个不重要的利基行为,但这一事实意味着错过const
可能会被忽视。
答案 0 :(得分:4)
如果函数的声明和定义不同意参数是否为
const
,会发生什么?
您应该收到编译错误。
怎么办?
更新您的编译器。
使用gcc 4.2.1,如果我从标题或源文件中删除const
,我收到错误:
Georgioss-MacBook-Pro:~ gsamaras$ gcc -Wall main.c code.c
code.c:3:6: error: conflicting types for 'someFunc'
void someFunc(const char* str){ printf("%s\n", str); }
^
./code.h:1:6: note: previous declaration is here
void someFunc(char*);
^
1 error generated.
使用gcc版本4.9.2(Debian 4.9.2-10),我得到了同样的行为。
与gcc的7.1.0版本相同,在Wandbox上联机:
我的猜测是您遇到的行为是架构/编译器依赖于版本。
答案 1 :(得分:0)
在C中,如果函数声明和函数定义对编译器都可见,并且不匹配,则需要进行诊断。
如果您的编译器实际上是C ++编译器,则声明和定义不需要匹配 - 因为它们将被视为重载。但是,如果未定义两个重载,则会出现链接器错误(编译单元调用它们看到声明的重载,并且链接失败,因为未定义该函数)。
如果传递的参数是正确的,那么从头部而不是定义中可以看到声明的其他编译单元将被编译,否则将失败。在C和C ++中。
如果您的代码一致地构建和运行,那么您的编译器不会以标准方式运行(例如,使其在这方面不符合的编译选项)。或者构建过程存在一些问题(例如,如果一个对象没有被重建,如果它依赖于更改的头文件或源文件 - 这意味着可执行文件对应于源的旧版本。)