【问题标题】:Pass string macro into C program - cross-platform将字符串宏传递给 C 程序 - 跨平台
【发布时间】: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\"。仍然没有单引号,而是反斜杠和双引号。

标签: c linux windows macros


【解决方案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('"', '\\"')

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-29
    • 2011-11-26
    • 1970-01-01
    • 2023-03-15
    • 2014-03-19
    相关资源
    最近更新 更多