【问题标题】:Conditional Operator the only way to initialize global variables at a global scope?条件运算符是在全局范围内初始化全局变量的唯一方法?
【发布时间】:2016-09-05 13:21:59
【问题描述】:

好的,所以我有一个充满全局变量的头文件。 这是一个实现的示例(在 .cpp 文件中):

extern double event::m_chance = 0.01;

到目前为止没有什么特别的。但是当我的代码变得更复杂时,我开始实现#define MASTER_MODE 用于测试目的。 所以现在看起来像这样:

extern double event::m_chance = MASTER_MODE ? 0.5 : 0.01;

我问自己:这是唯一在全局范围内(有条件)初始化全局变量的方法吗? 因为 if 语句在这里不起作用......它一定是,对吧?

//declarations
extern double event::m_chance;

if (MASTER_MODE) { //Error: excepted a declaration
    event::m_chance = 0.5;
    //other variables should be here
}
else { //nope
    event::m_chance = 0.01;
    //other variables should be here
}

我只是问自己,这是否是其他人在我的位置上所做的事情。或者是否有一个更好的标准-定义)方式来初始化它们..(比如制作一个额外的功能等)。

感谢您的帮助/建议!

【问题讨论】:

  • 我会做与您在第一个示例中所做的相同的事情。但是,如果您想更改变量或更改代码结构,您始终可以分配默认值0.01 和 do if(MASTER_MODE) { event::m_chance = 0.5;}。但这会在运行时而不是在预处理器中更改变量
  • 不,这不是唯一的方法。有涉及模板专业化(所有版本的 C++)或(C++11 及更高版本)constexpr 函数、lambdas 等的选项。

标签: c++ initialization


【解决方案1】:
#ifdef MASTER_MODE

    extern double event::m_chance = 0.5;
    //other variables should be here

#else

    extern double event::m_chance = 0.01;
    //other variables should be here

#endif

【讨论】:

  • 哇,没想到这一点。完全有道理,而且性能友好!谢谢你:)
  • @StackDanny 恕我直言,性能与您使用三元运算符的代码相同:现代编译器将始终尽可能优化条件,并且由于条件在编译时已知,编译器可以直接放置条件结果。另外,我更喜欢你的三元运算符,因为你会直接看到变量是否存在于 MASTER_MODE 中
  • 但是您可以将声明 放在 #define 之前,然后它会像 if 语句一样工作
【解决方案2】:

lambda 怎么样?

#include <iostream>

bool some_condition = true;

int some_global = [&]()
{
    if (some_condition)
    {
        return 10;
    }
    else
    {
        return 20;
    }
}();

int main() {
    std::cout << some_global;
}

【讨论】:

  • ...或具有全局链接的任何函数/对象的结果
  • 这对一个变量很有效,但我有好几百个!
  • @LightnessRacesinOrbit 问题提到“因为 if 语句在这里不起作用”。我当时有点调皮。
猜你喜欢
  • 2022-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-05
相关资源
最近更新 更多