将字符串宏传递到C程序 - 跨平台

3

我需要在编译时将一个字符串值传递到我的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"'

然后我只是 <\p>
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"(注意双引号)。 - Some programmer dude
那是上面的第二种方法。我必须执行-DNAME='"value"'。但在Windows上似乎不起作用。 - wrgrs
1
去掉单引号,保留双引号。 - Some programmer dude
那甚至无法编译。引号未被Shell传递。 - wrgrs
1
当然,在shell中你需要转义它们:-DNAME=\"value\"。仍然没有单引号,但是有反斜杠和双引号。 - Some programmer dude
1个回答

1

由于我在使用Python,我可以手动处理平台特定的细节:

value = 'my/complicated%/string'
quoted_value = '"{}"'.format(value)
if sys.platform.startswith('win32'):
    quoted_value = quoted_value.replace('%', '%%')
    quoted_value = quoted_value.replace('"', '\\"')

进一步的特殊字符会使这更加复杂。

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