c - C include guards到底做了什么?

标签 c macros c-preprocessor header-files include-guards

假设我有一个带有函数定义的头文件“header.h”。

#ifndef HEADER_FILE
#define HEADER_FILE

int two(void){
return 2;
}

#endif

这个头文件有一个包含保护。但是,我对#define HEADER_FILE 实际上在做什么感到困惑。假设我忘记了 include 保护,完全忽略添加“#define HEADER_FILE”对我来说是完全合法的。

当我们定义 HEADER_FILE 时,我们究竟在做什么?我们在定义什么?为什么可以忘记包含防护,在这种情况下我们也可以忘记添加#define HEADER_FILE?

最佳答案

这是一个预处理器宏。

所有这些都是预处理器语法,基本上就是说,如果这个宏还没有被定义,定义它并包含 #ifndef#endif 之间的所有代码

它的作用是防止多次包含文件,这可能会导致您的代码出现问题。

您的问题:

And why is it okay to forget the include guard in which case we can also forgot adding #define HEADER_FILE?

忘记它没关系,因为没有它它仍然是合法的 C 代码。预处理器在编译之前处理您的文件,如果没有逻辑说明为什么不应该在最终程序中包含指定的代码。这只是一种常见做法,但不是必需的。

一个简单的例子可能有助于说明这是如何工作的:

我们会说您的头文件 header_file.h 包含以下内容:

#ifndef HEADER_FILE
#define HEADER_FILE

int two(void){
    return 2;
}

#endif

在另一个文件 (foo.c) 中,您可能有:

#include "header_file.h"

void foo() {
    int value = two();
    printf("foo value=%d\n", value);       
}

一旦“预处理”并准备好编译,这将转化为:

int two(void){
    return 2;
}

void foo() {
    int value = two();
    printf("foo value=%d\n", value);       
}

include guard 在这里完成的所有工作是确定是否应该粘贴 #ifndef ...#endif 之间的 header 内容来代替原始内容#include

但是,由于该函数未声明为 externstatic,并且实际上是在头文件中实现的,因此如果您尝试使用它就会遇到问题在另一个源文件中,因为不会包含函数定义。

关于c - C include guards到底做了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27810115/

相关文章:

c - 为什么我用gdb调试的时候是 "No symbol file now"?

c - C中的0.5++是什么

macros - Nemerle 自定义运算符问题

c - 宏执行整数运算

c - 简单的 makefile 不生成输出文件(正确)

c - 如何获取结构 "Elf64_Rela"中的符号名称

不能让不同的编译器使用特定的头文件?

c++ - Platform C 预处理器定义

编译器无法理解 '_FILE_' 为什么?

macros - 将列表传递给 Common Lisp 中的宏