Вызов функций C из функций constexpr C ++ - PullRequest
0 голосов
/ 20 ноября 2018

Я портирую проект из одной системы сборки в другую, но использую тот же компилятор (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 ++?
...