Gcc 如果没有多个包含保护,则不会出现编译错误

Gcc 如果没有多个包含保护,则不会出现编译错误,gcc,Gcc,不包括#ifndef保护以防止包含多个头文件,不会引发编译错误。为什么呢 // main.c #include <stdio.h> #include "declare.h" #include "declare.h" //Shouldn't I get compiler error here int main(){ printf("Hello World\n"); } 用于编译的命令:gcc main.c-std=c89多次包含一个标题,无论是否有保护,都不是错误 当您

不包括#ifndef保护以防止包含多个头文件,不会引发编译错误。为什么呢

// main.c

#include <stdio.h>

#include "declare.h"
#include "declare.h" //Shouldn't I get compiler error here

int main(){

  printf("Hello World\n");

}

用于编译的命令:
gcc main.c-std=c89

多次包含一个标题,无论是否有保护,都不是错误

当您重新定义对象和函数时,防护装置会阻止您进行重新定义

但你还没有做到。您刚刚用与以前相同的值重新定义了宏。这很好

您可以通过编译以下文件来测试这一点:

#define a 1
#define a 1
很好


[C89:6.8.3]:
[…]当前定义为不使用lparen的宏的标识符(类似对象的宏)可以由另一个#define preprocessing指令重新定义,前提是第二个定义是类似对象的宏定义,并且两个替换列表相同。[……]



开始在标题中添加更复杂的内容时,您会看到一个问题。

多次包含标题不是错误,无论是否有保护

当您重新定义对象和函数时,防护装置会阻止您进行重新定义

但你还没有做到。您刚刚用与以前相同的值重新定义了宏。这很好

您可以通过编译以下文件来测试这一点:

#define a 1
#define a 1
很好


[C89:6.8.3]:
[…]当前定义为不使用lparen的宏的标识符(类似对象的宏)可以由另一个#define preprocessing指令重新定义,前提是第二个定义是类似对象的宏定义,并且两个替换列表相同。[……]



开始在标题中添加更复杂的内容,您将看到一个问题。

谢谢。但是,您提到“重新定义函数应该会抛出错误”。但是,在头文件中添加函数声明也不会引发错误。你能举例说明什么时候会出现错误吗?@Vis我说的是重新定义,而不是重新定义。@Vis-重新定义一个函数不是问题;无法重新定义枚举或结构类型。在旧的C标准(C99或之前)中,您无法重新定义
typedef
;在C11及更高版本中,如果引用相同类型(C11),则可以重复
typedef
。谢谢。但是,您提到“重新定义函数应该会抛出错误”。但是,在头文件中添加函数声明也不会引发错误。你能举例说明什么时候会出现错误吗?@Vis我说的是重新定义,而不是重新定义。@Vis-重新定义一个函数不是问题;无法重新定义枚举或结构类型。在旧的C标准(C99或之前)中,您无法重新定义
typedef
;在C11及更高版本中,如果引用相同类型(C11),则可以重复
typedef