ric*_*ard 66 c c++ macros command-line gcc
在gcc命令行中,我想定义一个字符串-Dname=Mary,然后在我要printf("%s", name);打印的源代码中Mary.
我怎么能这样做?
Art*_*ski 85
两种选择.首先,逃避引号,以便shell不吃它们:
gcc -Dname=\"Mary\"
Run Code Online (Sandbox Code Playgroud)
或者,如果你真的想要-Dname = Mary,你可以对它进行字符串化,尽管它有点hacky.
#include <stdio.h>
#define STRINGIZE(x) #x
#define STRINGIZE_VALUE_OF(x) STRINGIZE(x)
int main(int argc, char *argv[])
{
printf("%s", STRINGIZE_VALUE_OF(name));
}
Run Code Online (Sandbox Code Playgroud)
请注意,STRINGIZE_VALUE_OF将很乐意评估宏的最终定义.
Joh*_*ann 25
为了避免shell"吃掉"引号和其他字符,你可以试试单引号,如下所示:
gcc -o test test.cpp -DNAME='"Mary"'
Run Code Online (Sandbox Code Playgroud)
这样您就可以完全控制定义的内容(引号,空格,特殊字符和所有内容).
到目前为止我发现的大多数可移植方式都是使用\"Mary\"- 它不仅适用于gcc,还适用于任何其他C编译器.例如,如果您尝试使用/Dname='"Mary"'Microsoft编译器,它将会因错误而停止,但/Dname=\"Mary\"会起作用.
在Ubuntu中我使用的是定义CFLAGS的别名,CFLAGS包含一个定义字符串的宏,然后我在Makefile中使用CFLAGS.我不得不逃避双引号字符和\字符.它看起来像这样:
CFLAGS='" -DMYPATH=\\\"/home/root\\\" "'
Run Code Online (Sandbox Code Playgroud)