从C ++ constexpr函数调用C函数

时间:2018-11-20 15:41:18

标签: c++ c gcc constexpr

我正在将一个项目从一个构建系统移植到另一个构建系统,但使用的是相同的编译器(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

0 个答案:

没有答案