【发布时间】:2016-10-21 08:44:38
【问题描述】:
我需要在编译时将字符串值传递给我的 C 程序:
-DNAME=value
我知道有两种方法可以做到这一点:这里描述的字符串化:https://gcc.gnu.org/onlinedocs/cpp/Stringification.html
#define xstr(s) str(s)
#define str(s) #s
...
printf("%s\n", xstr(NAME));
我这里的问题是字符串中的宏被替换了,所以当我的字符串包含-linux-时,它在linux上变成了-1-。
另一种方法是在传递时尝试正确引用字符串。我正在从 Python setup.py 文件执行此操作,如下所示:
macros = [('NAME', '"value"')]
或等效
-DNAME='"value"'
那我就
printf("%s\n", NAME);
但我找不到在 Linux (gcc) 和 Windows(MSVC 9 for Python 2.7)上正确执行此操作的方法。
字符串可能包含/、\ 或%,这可能会使情况变得复杂,因此我需要进行一些转义。
让我们把它带回setup.py,这就是它需要工作的地方。
value = '"value"' # works on Linux but not Windows
value = '\\"value\\"' # works on Windows but not Linux
【问题讨论】:
-
为什么不简单地将宏定义为字符串?喜欢
-DNAME="value"(注意双引号)。 -
这是上面的第二种方式。我必须做
-DNAME='"value"'。但它似乎不适用于 Windows。 -
去掉单引号,保留双引号。
-
那甚至无法编译。引号不会被 shell 传递。
-
啊,当然,在 shell 中你需要转义它们:
-DNAME=\"value\"。仍然没有单引号,而是反斜杠和双引号。