仅当符合静态constexpr C ++时才包含要编译的代码

时间:2017-05-02 21:30:51

标签: c++ constexpr

是否可以包含仅在静态constexpr具有特定值时编译的代码?

以此为例

static constexpr auto VERSION_MIN = 123;

如果数字设置为124,则包含要编译的代码,否则将其排除。

基本上我有两个相同的源包,除了几行代码被认为是额外的或微小的差异。

我只是想制作一个通用的应用程序,我不需要重新编译来切换版本。

我如何检查constexpr是否等于124,我是否只使用基本控制结构?还是有另一种方法可以做到这一点吗?

2 个答案:

答案 0 :(得分:1)

以下适用于gcc 4.9:

static constexpr auto VERSION_MIN = 123;

void myFunction()
{
    if (VERSION_MIN == 123) {
        printf("This is version 123\n");
    }
    else {
        printf("This is another version\n");
    }
}

在Linux上(现在不要使用Win这样的工具),你可以检查二进制文件是否包含字符串“这是另一个版本\ n”。

因此你可以替换

#ifdef VERSION_MIN 123
    printf("This is version 123\n");
#else
    printf("This is another version\n");
#endif

我的IDE(QtCreator)比预处理器代码更好地处理“纯”C ++代码。

答案 1 :(得分:0)

Microsoft Visual Studio 2015(如果您正在使用它)已使用构建配置解决了此问题。您可以创建一个新的构建配置,然后为其提供一个预处理器指令,以便在构建时自动插入代码中。这将允许您为代码的每个“版本”创建不同的构建配置,然后您可以“批量构建”来构建每个版本;而不更改每个版本的实际源代码。

要执行此操作,请转到Configuration Manager(在Release / Debug Dropdown下),然后为您的版本提供先前构建配置中的名称和复制设置。创建构建配置后,在“配置”下拉列表中将其选中以使其处于活动状态,然后转到“项目属性”(Alt + p + p) - > C / C ++ - >预处理器 - >预处理器定义并添加预处理器来控制在该版本中编译的代码以及未编译的代码。

#ifdef _DEBUG
std::cout << "data data data" << std::endl;
#endif //_DEBUG