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为路径有效,因此该文件确实存在。那么,我错过了什么?
我缺少什么?
可能已经够引述了。在 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)