C函数声明和实现中的Const

时间:2017-05-24 11:28:31

标签: c function compilation const function-prototypes

我在code.h中声明了一个函数,并在code.c中实现。 它就像:

void someFunc(const char*);

#include "code.h"
void someFunc(const char* str){ printf("%s\n", str); }

现在我发现我可以删除文件的任何一个中的const(将其保留在另一个文件中)并编译&运行没有错误。 我想知道这是什么意思? 其中一个文件是唯一重要的文件吗?

这可能听起来只是一个不重要的利基行为,但这一事实意味着错过const可能会被忽视。

2 个答案:

答案 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上联机:enter image description here

我的猜测是您遇到的行为是架构/编译器依赖于版本。

答案 1 :(得分:0)

在C中,如果函数声明和函数定义对编译器都可见,并且不匹配,则需要进行诊断。

如果您的编译器实际上是C ++编译器,则声明和定义不需要匹配 - 因为它们将被视为重载。但是,如果未定义两个重载,则会出现链接器错误(编译单元调用它们看到声明的重载,并且链接失败,因为未定义该函数)。

如果传递的参数是正确的,那么从头部而不是定义中可以看到声明的其他编译单元将被编译,否则将失败。在C和C ++中。

如果您的代码一致地构建和运行,那么您的编译器不会以标准方式运行(例如,使其在这方面不符合的编译选项)。或者构建过程存在一些问题(例如,如果一个对象没有被重建,如果它依赖于更改的头文件或源文件 - 这意味着可执行文件对应于源的旧版本。)