#include <sys/types.h>
//Line 2: typedef unsigned int uint;
//Line 3: typedef unsigned int uint;
int main() {
uint a;
return 0;
}
给定上面的 C 代码,它编译成功,因为 uint 定义在<sys/types.h>
. 即使它不是标准化的,它也是为了 Sys V 兼容性而添加的,并在代码中进行了注释。
取消注释上述代码的第二行仍然可以成功编译。据我了解,不允许重新定义一种类型,通过取消注释第二行和第三行来确认,这将导致一个编译错误。
为什么编译器足够聪明,可以知道 uint 是在标准库或用户代码中定义的?gcc 和 clang 都给出了一致的行为。
编辑:在这种情况下,链接不是游戏的一部分。该错误仅通过编译重现,即(-c 选项)。
添加行号以减少混淆。
编辑:
取消注释上述代码的第二行仍然可以成功编译。据我了解,不允许重新定义一种类型,通过取消注释第二行和第三行来确认,这将导致一个编译错误。
我不知道我为什么写这个。显然,取消注释第 2 行和第 3 行不会导致 gcc 的编译错误。Clang 给出的错误默认编译选项要严格得多,可以通过传递一些参数来调整。
这里描述了是否允许使用多个 typedef,结果是相当复杂的。无论如何只是尽量避免重复的typedef。