如何在VC 2005 (C++)的命令行中创建一个字符串预处理器定义?

5

文档 告诉我可以使用 /D 命令行开关来实现这个功能,像这样:

  CL /DDEBUG TEST.C

将定义一个 DEBUG 符号。
  CL /DDEBUG=2 TEST.C

如果我想获得与字符串定义相当的值,该怎么办呢?

将其赋值为2即可。

  #define DEBUG "abc"

?

5个回答

6
由于Windows中的命令行解析方式,您需要转义引号。
CL /DDEBUG=\"abc\" TEST.C

2

这个方法适用于我在VS2013中的操作:

/D_STRING="\"abc\""

那么它等同于
#define _STRING "abc"

请问这段需要翻译成哪种语言?
/D_STRING="abc"

这将相当于

#define _STRING abc

1
你试过了吗?
CL /DDEBUG=abc TEST.C

或者

CL /DDEBUG="abc" TEST.C

1
谢谢Glen,第二个方法可以在命令行上使用,但我问的同事最终在项目定义中使用了它(需要转义双引号并将=替换为#):
/DDEBUG#\"abc\"

-1

我没有VC来为您测试,但原则上以下内容应该可以工作:

CL /DSTRINGIFY(X)=#X /DDEBUG=STRINGIFY(abc) TEST.C

更新:

正如Kuber-Ober所指出的那样,VC在这里似乎没有做正确的事情。通过一个简单的示例进行测试,它生成了:

const char * s = STRINGIFY(abc);

它可能适用于其他编译器,例如以下g ++命令行可行:

g++ -D'STRINGIFY(X)=#X' -D'DEBUG=STRINGIFY(abc)' t.cc -E

# 1 "t.cc"
# 1 "<built-in>"
# 1 "<command line>"
# 1 "t.cc"

const char * s = "abc";

不幸的是,在MSVC2012下,您无法通过命令行传递带有参数的预处理器定义 :( - Kuba hasn't forgotten Monica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接