使用非constexpr函数设置constexpr变量(但可以在编译时计算)

时间:2017-02-26 03:26:28

标签: c++ constexpr

header.h

extern constexpr double sqrt_of_2;
extern constexpr double sqrt_of_1_2;
double sqrt(double x);

的main.cpp

#include <header.h>

int main() {
  int n;
  scanf("%d", &n);
  printf("%lf %lf\n", sqrt_of_2, sqrt(n));
  return 0;
}

source.cpp

#include <header.h>

double sqrt(double x) {
 // complex bits of math
 // huge function
 // must not be in header for speedy compilation
 // will call other small non-constexpr functions in this file
}

constexpr double sqrt_of_2 = sqrt(2.0);
constexpr double sqrt_of_1_2 = sqrt(0.5)

这显然不起作用。

我无法在source.cpp中为constexpr添加sqrt,因为它与header.h中的声明不匹配。我也无法在header.h中为constexpr添加sqrt,因为constexpr暗示inline,然后我需要将source.cpp中的所有内容转移到标头中。小时。

这甚至可能吗?

1 个答案:

答案 0 :(得分:3)

没有。这就是创建constexpr的原因 - 创建函数来封装编译时函数。

在没有完成编译时计算的情况下编译代码编译单元没有意义。

目标文件旨在简单地连接起来以解决链接时依赖性。编译时计算必须在编译时定义,因此必须在编译时单元中具有实现。