C 定义的范围是什么?

C 定义的范围是什么?,c,c-preprocessor,C,C Preprocessor,定义的范围是什么 我有一个关于C/C++的#define的范围的问题,我试图理解预处理器 假设我有一个包含多个源文件和头文件的项目。假设我有一个具有以下内容的头文件: // header_file.h #ifndef __HEADER_FILE #define __HEADER_FILE #define CONSTANT_1 1 #define CONSTANT_2 2 #endif 假设我有两个按以下顺序编译的源文件: // source1.c #

定义的范围是什么

我有一个关于C/C++的#define的范围的问题,我试图理解预处理器

假设我有一个包含多个源文件和头文件的项目。假设我有一个具有以下内容的头文件:

// header_file.h

#ifndef __HEADER_FILE
#define __HEADER_FILE

#define CONSTANT_1          1
#define CONSTANT_2          2

#endif
假设我有两个按以下顺序编译的源文件:

// source1.c

#include header_file.h

void funct1(void)
{
    int var = CONSTANT_1;
}


// source2.c    

#include header_file.h

void funct2(void)
{
    int var = CONSTANT_2;
}
假设我已经包含了所有其他必要的开销,这段代码应该可以很好地编译。然而,我很好奇在编译之间会记住什么定义。当我编译上述代码时,每个#include的内容是实际包含的,还是实际实现了include防护

TLDR:是否定义了从一个编译单元到下一个编译单元的结转?或者#define是否只存在于单个编译单元中


当我把这个打出来的时候,我相信我在回答我自己的问题,我会陈述我相信的答案#定义被约束到单个编译单元(.c)。当预处理器从一个编译单元转到下一个编译单元时,它实际上忘记了任何#定义。因此,在我上面列出的例子中,include守卫不起作用。我的观点正确吗?

source1.c是与source2.c分开编译的,因此,您的定义在编译时针对source1进行处理,然后作为独立操作在编译时针对source2进行处理


希望这是一个清晰的解释。

source1.c是与source2.c分开编译的,因此您的定义在编译时会针对source1进行处理,然后作为一个独立的操作在编译时针对source2进行处理

希望这是一个清楚的解释。

是的,你是对的!! 编译一个文件,就其本身而言,仅仅是一个正在执行的过程。除非明确地执行,否则一个进程不能与另一个进程交互。c预处理器只是文字替换机制,以一种愚蠢的方式执行。无论执行什么样的条件检查,都仅限于正在进行的预处理器实例,一旦执行(编译)结束,就不会结转任何内容。预处理器不“配置”编译器,它们的范围仅限于“它们自己的编译”

是的,您是对的!!
编译一个文件,就其本身而言,仅仅是一个正在执行的过程。除非明确地执行,否则一个进程不能与另一个进程交互。c预处理器只是文字替换机制,以一种愚蠢的方式执行。无论执行什么样的条件检查,都仅限于正在进行的预处理器实例,一旦执行(编译)结束,就不会结转任何内容。预处理器不“配置”编译器,它们的范围是有限的,直到“它们自己的编译”

预处理器宏本身没有“范围”,它们只定义一段文本来替换代码中的宏

这意味着编译器永远不会看到字符串
CONSTANT_1
CONSTANT_2
,而是以预处理的形式获取源代码,并将这些宏替换为它们的扩展(
1
2


您可以使用
-E
标志调用
gcc
,或者使用仅在特定编译器上执行预处理的任何标志来检查此预处理源代码。

预处理器宏本身没有“作用域”,它们只定义一段文本来替换代码中的宏

这意味着编译器永远不会看到字符串
CONSTANT_1
CONSTANT_2
,而是以预处理的形式获取源代码,并将这些宏替换为它们的扩展(
1
2

您可以通过调用带有
-E
标志的
gcc
来检查此预处理源代码,或者只对特定编译器进行预处理。

TL/DR:
\define
在每个编译单元中从定义点向下到定义点都可见。TL/DR:
\define
的可能重复在每个编译单元中从定义点向下到
#未定义
-ed。可能的重复项