Я узнаю о предложении C ++ 1z для модулей. Моя самая большая надежда состоит в том, что это заменит использование dllimport
, dllexport
на окнах. С модулями c ++ 1z смогу ли я собрать .dll
на окнах и .so
на Linux, избегая использования dllimport/dllexport
? Будет ли модуль export
быть всем, что нужно на всех платформах и компиляторах?
К сожалению нет.
Предложения по модулям в C ++ пытаются устранить недостатки в заголовках, которые становятся особенно проблематичными в коде, который включает заголовки.
Шаблоны обычно реализуются полностью в заголовке, но это означает, что содержимое шаблона становится предметом любых определений препроцессора, которые происходят до включения этого заголовка.
Например, если ваш шаблон использует i
в качестве идентификатора и заголовка с чем-то вроде #define i 2
если он будет включен до заголовка вашего шаблона, ваш код может начинаться так:
for (int i=0; i<10 ; i++)
…но после того, как препроцессор сделан, это будет выглядеть так:
for (int 2=0; 2<20; 2++)
…и это, очевидно, не будет компилироваться вообще.
Модули исправляют это. Модуль компилируется независимо, а не в заголовке. Поскольку он компилируется независимо, другие заголовки не влияют на модуль, если только его исходный код не включает эти заголовки.
Аналогично, любые определения препроцессора, сделанные в заголовке, не могут влиять ни на один код, импортирующий модуль. Единственные имена в модуле, которые становятся видимыми в файле, который импортирует этот модуль, — это имена, явно экспортированные из модуля.
Dllexport все еще будет необходим, но dllimport, вероятно, будет автоматическим. По крайней мере в Модули C ++ в VS 2015, обновление 1 они говорят это в одном комментарии:
Эндрю Пардо [MSFT]
@Matthias: теперь программисту нужно только сказать __declspec (dllexport) для символов, которые должны быть экспортированы на границах DLL. __declspec (dllimport) заботится компилятором при использовании модуля.
К сожалению, я не нашел более достоверной информации об этом.