如何在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";