如何在gcc命令行中定义string字面值?

在gcc命令行中,我想定义一个string,例如-Dname=Mary ,然后在源代码中我想要printf("%s", name); 打印Mary
我怎么能这样做?

两个选项。 首先,不要使用引号,所以shell不会吃掉它们:

 gcc -Dname=\"Mary\" 

或者,如果你真的想要-Dname = Mary,你可以把它串起来,虽然这有点不好意思。

 #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)); } 

请注意,STRINGIZE_VALUE_OF将愉快地评估到一个macros的最终定义。

为了避免shell“吃”引号和其他字符,你可以尝试下面的单引号:

 gcc -o test test.cpp -DNAME='"Mary"' 

这样你就可以完全控制定义的东西(引号,空格,特殊字符和全部)。

到目前为止,我发现的大多数可移植的方式都是使用\"Mary\" – 它不但可以用gcc工作,而且可以用其他的C编译器工作。 例如,如果您尝试在Microsoft编译器中使用/Dname='"Mary"' ,则会停止并显示错误,但是/Dname=\"Mary\"将会起作用。

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

 CFLAGS='" -DMYPATH=\\\"/home/root\\\" "' 

仅供参考:同一系统上相同工具链的不同版本,在这方面可能会有不同的performance(如同, 似乎这将是一个通过shell的问题,但显然它不仅限于shell)。

这里我们有xc32-gcc 4.8.3与(avr-)gcc 4.7.2(和其他几个 )使用相同的makefile和main.c,唯一的区别是'make CC=xc32-gcc'等。

CFLAGS += -D'THING="$(THINGDIR)/thing.h"'已经在多年的gcc(和bash)的许多版本中使用。

为了使这与xc32-gcc兼容(并且根据另一个评论声称\“比'更便于携带'),必须做以下工作:

 CFLAGS += -DTHING=\"$(THINGDIR)/thing.h\" ifeq "$(CC)" "xc32-gcc" CFLAGS := $(subst \",\\\",$(CFLAGS)) endif 

使事情发现这件事情真的很混乱:显然是一个没有引号-D与一个#结果在#define最后的评论 …例如

THINGDIR=/thingDir/ – > #define /thingDir//thing.h – > #define /thingDir

(感谢从这里回答帮助,顺便说一句)。

这是我的解决scheme: -DUSB_PRODUCT=\""Arduino Leonardo\""
我用它在一个makefile中:
GNU Make 3.81(来自GnuWin32)

avr-g ++(AVR_8_bit_GNU_Toolchain_3.5.0_1662)4.9.2

预编译文件中的结果(g ++的-E选项)是:
const u8 STRING_PRODUCT[] __attribute__((__progmem__)) = "Arduino Leonardo";