【发布时间】:2013-11-20 01:24:55
【问题描述】:
我希望在我的代码中添加一些条件指令来控制不同的构建,例如:
#if VERSION > 100
/* Compiling here */
#endif
问题是“VERSION”在我无法更改的其他代码中。它被定义为一个字符串:
#define VERSION "101"
我想知道是否有某种宏或指令可以将字符串转换为数字,所以我可以简单地做
#if STRING_TO_NUMBER(VERSION) > 100
/* Compiling here */
#endif
请问可以吗?
PS。 看来我的描述不是很清楚。这个需求的主要目的是控制版本分支。例如,在旧版本 100 之前的版本中,该程序会使用 old_function()。在这个版本之后,所有函数都迁移到了 new_function。所以我需要写这样的代码:
#if VERSION >= 100
old_function();
#else
new_function();
#endif
#if VERSION >= 100
int old_function()
{
...
}
#else
int new_function()
{
...
}
#endif
你可以看到只有一个函数会被编译。因此条件必须在预处理阶段确定,而不是在运行时确定。
棘手的部分是,VERSION 被定义为一个字符串,这带来了这个问题。
【问题讨论】:
-
在预处理阶段是否需要提供结果?或者您可以使用
inline函数或macro? -
他们把宏变成了字符串太糟糕了——从宏的值中获取字符串很容易(使用
#'stringize' 运算符),但要反其道而行之并不容易据我所知。 -
可能有一种方法可以使用模板元编程来代替。通过本质上调用或实例化基于版本的不同模板类。不过,您必须根据 VERSION 字符串创建一个类型。
-
我需要这个来编写分解代码。编译器将通过不同的版本分支生成不同的基于库的执行。在这种情况下,必须在预处理阶段完成。否则会命中链接错误。
标签: c c-preprocessor preprocessor-directive