C++ 编译时计算头文件中的常量

C++ 编译时计算头文件中的常量,c++,c++11,C++,C++11,我有一个头文件,其中包含基于用户操作系统的函数,它使用以下方法实现: #ifdef _WIN32 // Windows ... #else // Linux/Unix code (I know it will be either Windows or Linux/Unix) ... #endif 在适当的块中定义的函数当前在运行时从main调用并存储一个常量,但这让我想到:我可以在编译时在头中计算这个常量吗 比如: #ifdef _WIN32 // function here; call i

我有一个头文件,其中包含基于用户操作系统的函数,它使用以下方法实现:

#ifdef _WIN32 // Windows
...
#else // Linux/Unix code (I know it will be either Windows or Linux/Unix)
...
#endif
在适当的块中定义的函数当前在运行时从
main
调用并存储一个常量,但这让我想到:我可以在编译时在头中计算这个常量吗

比如:

#ifdef _WIN32 
// function here; call it foobar()
#define WINCONST foobar()
#else
// function here; call it xfoobar()
#define NIXCONST xfoobar()
#endif
constexpr uint32_t foo()
{
    // complex calculations...
    return 0;
}

uint32_t const SomeConstant = foo();
但是,我不确定是否可以在
#define
预处理器指令中使用函数调用。我知道你可以用一种方式来使用它,比如定义ADD(x,y)(x+y),但就是这样。

类似于:

#ifdef _WIN32 
// function here; call it foobar()
#define WINCONST foobar()
#else
// function here; call it xfoobar()
#define NIXCONST xfoobar()
#endif
constexpr uint32_t foo()
{
    // complex calculations...
    return 0;
}

uint32_t const SomeConstant = foo();
旁注:
foo
将被计算为编译时常量,只要不传递非编译时参数,因此上述定义也将产生编译时常量(相当于
uint32\u t SomeConstant=7;
)。但是,如果从
foo
中删除constexpr限定,代码不会中断,除非在需要编译时常量的地方使用常量(例如数组定义)。在后一种情况下,
constexpr
提供了更强的保证(即当
foo(/*…*/)
不是编译时间常数时编译失败):


“但是,我不确定您是否可以在#define preprocessor指令中使用函数调用”您可以在预处理器指令中使用任何可以扩展为适合您的文本的内容。@pstatix可能与此无关,但您为什么要这样做?什么不只是预先计算wincost分离并将值放在这里?或者winconst本身不是一个常数,取决于上面没有显示的更多编译器变量?@Siddharthabra
winconst
NIXCONST
都对一系列循环执行计算,以确定函数在用户系统上花费的用户时间量。它们不会对每个用户都有相同的价值,因为有些用户可能拥有更先进的机器;因此,它们应该在运行时或编译时进行计算。@Siddharthabra编译时如何“预计算”某些内容以存储常量?@pstatix如果它取决于用户机器,您是否计划在每个用户机器上分别编译解决方案?当您使用std::clock之类的函数时,您的表达式就不再是常量。不确定,但不会
someConstant
不是
constepr
意味着
foo()
不必在编译时调用,因此它的
constexpr
在本例中是无用的?
constexpr
函数在编译时尽可能地进行求值。因此,如果参数(确实有)是编译时常量,那么结果也会是这样,结果相当于
uint32\u t SC=7,这也是一个编译时常量。。。(旁注:如果
foo
不是constexpr或使用非编译时常量参数调用,则情况会发生变化。)我认为最好用constexpr替换const,以便将来,如果foo不再是constexpr,我们会有一个编译错误。@acocagua是否应该返回一些常量值?如果您返回0,它也可能是uint32_t const SomeConstant=0?”
constexpr
函数在编译时进行计算,只要这是可能的”只是一个QoI问题,但是,const积分的作用类似于constexpr,所以它很好,但在这里有误导性。