Я портирую проект из одной системы сборки в другую, но использую тот же компилятор (gcc 4.9, используя C ++ 14).Я только что натолкнулся на странную причину constexpr
в C ++, которую я не могу объяснить, и я надеялся, что кто-нибудь сможет мне помочь.
У меня есть функция, которая выглядит следующим образом:
#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.Что я не понимаю, так это почему это вообще сработало?
Возможно, возможно, что либо старая, либо новая система сборки (более вероятно, старая) выбирают версии системных заголовков, которые они не должны 't, поэтому две сборки видят разные файлы strings.h
.Весьма вероятно, что в каждом случае есть небольшие различия в флагах сборки.Я абсолютно уверен, что они оба используют один и тот же компилятор.
Если кто-нибудь знает, я хотел бы знать следующее:
- Почему первая сборка работала там, гдевторой нет?
- При каких обстоятельствах
gcc
позволит вам рассматривать функцию C как constexpr
в коде C ++?