【发布时间】:2021-12-09 20:47:42
【问题描述】:
可能是一个愚蠢(而且非常简单)的问题,但我想尝试一下,因为我不知道在哪里可以找到答案。我意识到某本书,我已经开始在谷歌上搜索一些东西 - 我实际上有点好奇为什么,如果我们有这样的文件:
file1.c
#include <stdio.h>
#include "file2.h"
int main(void){
printf("%s:%s:%d \n", __FILE__, __FUNCTION__, __LINE__);
foo();
return 0;
}
file2.h
void foo(void);
和
file2.c
#include <stdio.h>
#include "file2.h"
void foo(void) {
printf("%s:%s:%d \n", __FILE__, __func__, __LINE__);
return;
}
编译:
gcc file1.c file2.c -o file -Wall
为什么将包含foo 函数原型的file2.h 的头文件包含在声明foo 的同一文件中是一种好习惯?我完全理解将它附加到file1.c,而我们应该使用头文件来定义每个模块的接口,而不是写它“原始”,但是为什么将带有原型的头文件附加到它声明的文件(@ 987654333@)? -Wall 选项标志如果我不包含它也不会说什么,那么为什么人们说它是“正确的方法”?它是否有助于避免错误,还是只是为了更清晰的代码?
这些代码示例取自此讨论: Compiling multiple C files in a program
有些用户说这是“正确的方法”。
【问题讨论】:
-
一个原因很容易证明:将 file2.c 更改为
void foo(int)(不更改标头),然后在包含和不包含 file2.h 的情况下进行编译。 -
另一个原因是如果你不包含header,你只能在它定义之后调用
foo()。有了标头,file2.c中的任何函数都可以调用foo(),无论它在文件中的位置如何(当然是在标头的#include之后) -
@1201ProgramAlarm 我明白了,所以它对调试很有帮助,对吗?我们确实想将 int 类型的参数传递给 foo,但是编译器会显示错误,因为头文件中的原型不接受任何参数,对吗?所以基本上,我们这样做是为了更快地调试我们的代码?
-
@sj95126 哦,你完全正确。如果我想通过添加一些函数来扩展文件,那么如果某些函数会使用
foo()函数,那么foo()函数应该在想要使用它的函数之上。完全忘记了这一点。谢谢。
标签: c compilation linker