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中的所有内容转移到标头中。小时。
这甚至可能吗?
答案 0 :(得分:3)
没有。这就是创建constexpr
的原因 - 创建函数来封装编译时函数。
在没有完成编译时计算的情况下编译代码编译单元没有意义。
目标文件旨在简单地连接起来以解决链接时依赖性。编译时计算必须在编译时定义,因此必须在编译时单元中具有实现。