#define预处理器在C语言中是如何工作的

How #define preprocessor really works in C

本文关键字:何工作 工作 处理器 预处理 语言 #define      更新时间:2023-10-16

请考虑以下代码

#define FIRSTNAME ""
#define SECONDNAME "JOHN"
# define PATHSAVE(a) func(strcat(strcpy(tmpFileName, appDir), a))
int main() {
  PATHSAVE(FIRSTNAME SECONDNAME);
}

通过分析,我发现值"John"被传递给了函数PATHSAVE。我不明白为什么在这个函数PATHSAVE(FIRSTNAME SECONDNAME)中使用两个参数

您所写的内容将展开如下

func(strcat(strcpy(tmpFileName, appDir), "" "JOHN"));
                                         ^^ ^^^^^^
                                         || ||||||
                                         || SECONDNAME
                                         ||
                                         FIRSTNAME

将两个参数传递给宏,要求它们用,分隔,而不是用空格

PATHSAVE(FIRSTNAME SECONDNAME);

将展开为PATHSAVE("JOHN"),因为预处理器将两个字符串连接在一起。

这将进一步扩展为

func(strcat(strcpy(tmpFileName, appDir), "JOHN"))

如果你想知道发生了什么,你可以使用c预处理器。

我把你的代码粘贴到一个名为ex.c的文件中,下面是输出:

cpp ex.c

# 1 "ex.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "ex.c"

int main() {
  func(strcat(strcpy(tmpFileName, appDir), "" "JOHN"));
}