Я думаю, общеизвестно, что во фрагменте глобального модуля не может быть операторов и что фрагмент глобального модуля ограничен только директивами «препроцессора». С:
Код: Выделить всё
module;
int a = 3;
export module my_module;
Clang 22 по-прежнему не выдает предупреждение (по крайней мере, с настройками по умолчанию), но MSVC говорит:
C5202 фрагмент глобального модуля может содержать только директивы препроцессора
.
Хорошо, это достаточно справедливо. Но если я включу файл заголовка с:
И сделайте:
Код: Выделить всё
module;
#include "my_header.h"
export module my_module;
И никаких предупреждений больше не выдается. Таким образом, требование о том, что фрагмент глобального модуля может содержать только директивы препроцессора, а не операторы или типы, по-видимому, применяется только ДО завершения предварительной обработки, и поэтому:
Код: Выделить всё
/* PROHIBITED */
module;
int a = 3;
export module my_module;
/* THIS IS OK */
module;
#include "header_with_my_variable_declared.h"
export module my_module;
Таким образом, ограничение на то, что можно и что нельзя разрешить в «фрагменте глобального модуля», применимо только к вещам в том виде, в каком они сейчас есть ДО предварительной обработки, но ПОСЛЕ в основном там может быть что угодно, верно? Или неверно?
Подробнее здесь:
https://stackoverflow.com/questions/798 ... -to-before