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

标签 c linux windows macros

我需要在编译时将一个字符串值传递到我的 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(Python 2.7 的 MSVC 9)上正确执行此操作的方法。

这可能会因为字符串可能包含 /\% 而变得复杂,因此我需要进行一些转义。


让我们把它带回 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('"', '\\"')

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

关于c - 将字符串宏传递给 C 程序 - 跨平台,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40172120/

相关文章:

c - 函数调用后输出不同的值?

c - 从指针中窃取位

c - 多线程启动顺序

c++ - 如何在 linux 上创建虚拟 CAN 端口? (C++)

c++ - 使用 C API 漂亮地打印 Z3

c - GCC 优化掉无法优化的 if 子句

c++ - 负序转换为负数?

asp.net - Umbraco - 获取配置文件目录

c++ - Qt5 静态构建产生无法加载平台插件 "windows"

c# - 检查文件是否打开