如何在gcc命令行中定义字符串文字?

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将很乐意评估宏的最终定义.

  • 使用gcc 4.2,它的工作原理没有引用,例如:-Dname = Mary (3认同)

Joh*_*ann 25

为了避免shell"吃掉"引号和其他字符,你可以试试单引号,如下所示:

gcc -o test test.cpp -DNAME='"Mary"'
Run Code Online (Sandbox Code Playgroud)

这样您就可以完全控制定义的内容(引号,空格,特殊字符和所有内容).


psi*_*lia 7

到目前为止我发现的大多数可移植方式都是使用\"Mary\"- 它不仅适用于gcc,还适用于任何其他C编译器.例如,如果您尝试使用/Dname='"Mary"'Microsoft编译器,它将会因错误而停止,但/Dname=\"Mary\"会起作用.


Sam*_*uel 6

在Ubuntu中我使用的是定义CFLAGS的别名,CFLAGS包含一个定义字符串的宏,然后我在Makefile中使用CFLAGS.我不得不逃避双引号字符和\字符.它看起来像这样:

CFLAGS='" -DMYPATH=\\\"/home/root\\\" "'
Run Code Online (Sandbox Code Playgroud)

  • 有时,单引号和单引号都没有用,但是这样做了。其他时候没有。我认为不同之处在于标志是否整体放在引号中:`1)DEFINES = -DLOGPATH = \“ ./ logfile \” CFLAGS = -v $(DEFINES)......`2)DEFINES = -DLOGPATH = \\\“ ./ logfile \\\” CFLAGS =“ -v $ {DEFINES)....”`使用-v编译器选项有助于查看预处理程序的工作。 (2认同)