Как определить экспортируемую константу?

#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 " , встроенные переменные никогда не нужны в модуле (поскольку они не могут быть определены в нескольких единицах перевода).