#c #constants #c 20 #c -modules
Вопрос:
Я пробовал использовать функцию новых модулей, но не могу экспортировать глобальную константу. Экспорт, похоже, компилируется нормально, но при импорте компилятор жалуется, что константа не объявлена. Мой код:
test.cpp
export module test;
export struct my_type { int x, y; };
export constexpr int my_constant = 42;
export int my_function() { return my_constant; }
main.cpp
import test;
int main() {
my_type t{1, 2};
int i = my_function();
int j = my_constant; // <- error here
}
Что я делаю не так? Я использую g 11.1.0 в linux: g -11 -std=c 20 -fmodules-ts test.cpp main.cpp -o main
Сообщение об ошибке выглядит так: error: ‘my_constant’ was not declared in this scope
Комментарии:
1. Можете ли вы попробовать экспортировать его так же, как
const
? Интересно, у нас с модулями покаconstexpr
не очень ладится?2. @rturrado, кроме
const
того, тоже не работает.3. Оба
const
иconstexpr
определяют внутреннюю связь (т. е.static
), если не указано иное. Я нигде не могу найтиexport
, влияет ли это на это, так что вам, вероятно, нужно что-то вродеexport extern const int my_constant = 42;
4. @olm Это, кажется, делает свое дело. Опубликуйте это в качестве ответа, и я приму его
Ответ №1:
переменные, определяемые константой, по умолчанию имеют внутреннюю связь, поэтому может потребоваться записать ее как
export extern const int my_constant = 42;
Согласно https://en.cppreference.com/w/cpp/language/storage_duration export
определение должно привести к тому, что переменная будет иметь внешнюю связь, поэтому вы, возможно, попали в один из углов, где C 20 еще не полностью реализован.
Комментарии:
1. «возможно, вы попали в один из углов, где C 20 еще не полностью реализован» Я провел быстрый поиск и не увидел дефекта, поданного против g за это. Должен ли он быть?
Ответ №2:
Просто используйте inline
export inline constexpr int my_constant = 42;
Комментарии:
1. За исключением особого случая
extern "C "
, встроенные переменные никогда не нужны в модуле (поскольку они не могут быть определены в нескольких единицах перевода).