将字符串宏传递到C程序-跨平台
我需要在编译时将字符串值传递给我的C程序:将字符串宏传递到C程序-跨平台,c,linux,windows,macros,C,Linux,Windows,Macros,我需要在编译时将字符串值传递给我的C程序: -DNAME=value 我知道两种方法:这里描述的字符串化: 这里的问题是字符串中的宏被替换了,因此当我的字符串包含-linux-时,它在linux上变成-1- 另一种方法是在传递时尝试正确引用字符串。我在Pythonsetup.py文件中执行此操作,如下所示: macros = [('NAME', '"value"')] 或同等地 -DNAME='"value"' 那我就 printf("%s\n", NAME); 但在Linux(gcc)
-DNAME=value
我知道两种方法:这里描述的字符串化:
这里的问题是字符串中的宏被替换了,因此当我的字符串包含-linux-
时,它在linux上变成-1-
另一种方法是在传递时尝试正确引用字符串。我在Pythonsetup.py
文件中执行此操作,如下所示:
macros = [('NAME', '"value"')]
或同等地
-DNAME='"value"'
那我就
printf("%s\n", NAME);
但在Linux(gcc)和Windows(Python2.7的MSVC9)上,我都找不到正确的方法
字符串可能包含/
、\
或%
这一事实可能会使问题变得复杂,因此我需要进行一些转义
让我们回到
setup.py
,这就是它需要工作的地方
value = '"value"' # works on Linux but not Windows
value = '\\"value\\"' # works on Windows but not Linux
由于我使用Python,我可以手动处理平台细节:
value = 'my/complicated%/string'
quoted_value = '"{}"'.format(value)
if sys.platform.startswith('win32'):
quoted_value = quoted_value.replace('%', '%%')
quoted_value = quoted_value.replace('"', '\\"')
更多的特殊字符会使这一点更加复杂。为什么不简单地将宏定义为字符串?就像
-DNAME=“value”
(注意双引号)。这是上面的第二种方法。我必须执行-DNAME='“value”
。但它在Windows上似乎不起作用。删除单引号,保留双引号。这甚至无法编译。引号不会通过shell传递。当然,在shell中,您需要转义引号:-DNAME=\“value\”
。仍然没有单引号,只有反斜杠和双引号。
value = 'my/complicated%/string'
quoted_value = '"{}"'.format(value)
if sys.platform.startswith('win32'):
quoted_value = quoted_value.replace('%', '%%')
quoted_value = quoted_value.replace('"', '\\"')