我正在将一个项目从一个构建系统移植到另一个构建系统,但使用的是相同的编译器(gcc 4.9,使用C ++ 14)。我只是遇到了一个C ++中涉及constexpr
的奇怪问题,我无法解释,我希望有人能够帮助我。
我有一个看起来像这样的函数:
#include <strings.h>
constexpr uint8_t idToIndex(Id id) {
return ffs(static_cast<std::underlying_type_t<Id>>(id)) - 1;
}
(其中Id
只是一些枚举类型)。作为旧构建系统的constexpr
函数,这非常高兴。但是,由于使用了constexpr
中的ffs
,因此与新构建系统相同的功能会成为strings.h
。
这对我来说很有意义。毕竟,C没有constexpr
,并且ffs
是C头文件中的C函数。我不明白的是为什么这种方法首先起作用?
旧的或新的构建系统(很可能是旧的)可能都选择了不应该使用的系统头版本,因此两个构建都看到了不同的strings.h
文件。在每种情况下,构建标志都可能会略有不同。我绝对可以确定它们都使用相同的编译器。
如果有人知道,我想知道的是:
gcc
会允许您将C函数视为C ++代码中的constexpr
?