包含带有预处理器定义的文件

ruh*_*ner 3 c++ macros include-path c-preprocessor

我想包含一个文件并使用路径的预处理器定义。

// in projects preprocessor definitions:    
HEADER="../somePath/theHeader.h"

// in a file
#include HEADER
Run Code Online (Sandbox Code Playgroud)

这在 Windows 上有效,但 XCode 抱怨这一点并且找不到该文件。替换HEADER为路径有效,因此该文件确实存在。那么,我错过了什么?

Jon*_*ler 5

我缺少什么?

可能已经够引述了。在 Unix 上,您需要:

HEADER = "../somePath/theHeader.h"

${CC} ${CFLAGS} -DHEADER='${HEADER}' -c file.cpp
Run Code Online (Sandbox Code Playgroud)

宏定义包含双引号。如果您不将-DHEADER参数括在单引号中,shell 会(无)帮助地去掉双引号。通过将其放在单引号内,shell 可以帮助删除单引号,留下双引号供编译器查看。

Windows 上的命令行处理规则不同,cmd.exe处理器对引号的处理也不同。

顺便说一句,当我想让人们可以HEADER在命令行上指定 的值时,我使用:

HEADER = ../somePath/theHeader.h

${CC} ${CFLAGS} -DHEADER='"${HEADER}"' -c file.cpp
Run Code Online (Sandbox Code Playgroud)

现在我可以运行:

make HEADER=/other/path/to/header.h file.o
Run Code Online (Sandbox Code Playgroud)

它有效。使用原始符号,我必须写:

make HEADER='"/other/path/to/header.h"' file.o
Run Code Online (Sandbox Code Playgroud)

或类似的东西,如果您想使用命令输出来指定文件名,这会更麻烦,而且会更加尴尬。将第一个选项与第二个选项进行比较:

make HEADER=$(locate header.h)
make HEADER="\"$(locate header.h)\""
Run Code Online (Sandbox Code Playgroud)

  • 或者,您可以使用预处理器插入引号,这可能会少一些麻烦: `#define STRINGIFY(x) STRINGIFY_(x)` / `#define STRINGIFY_(x) #x` / `#include STRINGIFY(HEADER)` (4认同)