了解不同的#define声明

ani*_*ani 0 c macros

我有一个代码库,它以与我习惯的方式不同的方式使用#define。

我知道,例如,#define a 5将在代码中用5替换变量a。

但这意味着什么:

'#define MSG_FLAG 5, REG, MSGCLR'
Run Code Online (Sandbox Code Playgroud)

我尝试用一​​个简单的代码来完成它并进行编译。它采用最后一个值(例如第三个参数为MSGCLR)。

JET*_*ETM 5

预处理基本上只是在“实际”编译开始之前进行的字符串替换。因此,我们目前对变量是什么一无所知。

这里的逗号不是任何特殊语法。这将导致MSG_FLAG代码中的任何出现都被替换为5, REG, MSGCLR

大多数编译器都有一个只会运行预处理器的标志,因此您可以自己查看。在gcc上,这是-E。

因此,为了验证这一点,我们可以使用一些废话来源:

#define MSG_FLAG 5, REG, MSGCLR

MSG_FLAG
Run Code Online (Sandbox Code Playgroud)

编译 gcc -E test.c

输出为:

# 1 "test.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "test.c"


5, REG, MSGCLR
Run Code Online (Sandbox Code Playgroud)