Будут ли модули c ++ 1z заменять dllimport dllexport на Windows?

Я узнаю о предложении C ++ 1z для модулей. Моя самая большая надежда состоит в том, что это заменит использование dllimport, dllexport на окнах. С модулями c ++ 1z смогу ли я собрать .dll на окнах и .so на Linux, избегая использования dllimport/dllexport? Будет ли модуль export быть всем, что нужно на всех платформах и компиляторах?

1

Решение

К сожалению нет.

Предложения по модулям в C ++ пытаются устранить недостатки в заголовках, которые становятся особенно проблематичными в коде, который включает заголовки.

Шаблоны обычно реализуются полностью в заголовке, но это означает, что содержимое шаблона становится предметом любых определений препроцессора, которые происходят до включения этого заголовка.

Например, если ваш шаблон использует i в качестве идентификатора и заголовка с чем-то вроде #define i 2 если он будет включен до заголовка вашего шаблона, ваш код может начинаться так:

for (int i=0; i<10 ; i++)

…но после того, как препроцессор сделан, это будет выглядеть так:

for (int 2=0; 2<20; 2++)

…и это, очевидно, не будет компилироваться вообще.

Модули исправляют это. Модуль компилируется независимо, а не в заголовке. Поскольку он компилируется независимо, другие заголовки не влияют на модуль, если только его исходный код не включает эти заголовки.

Аналогично, любые определения препроцессора, сделанные в заголовке, не могут влиять ни на один код, импортирующий модуль. Единственные имена в модуле, которые становятся видимыми в файле, который импортирует этот модуль, — это имена, явно экспортированные из модуля.

4

Другие решения

Dllexport все еще будет необходим, но dllimport, вероятно, будет автоматическим. По крайней мере в Модули C ++ в VS 2015, обновление 1 они говорят это в одном комментарии:

Эндрю Пардо [MSFT]

@Matthias: теперь программисту нужно только сказать __declspec (dllexport) для символов, которые должны быть экспортированы на границах DLL. __declspec (dllimport) заботится компилятором при использовании модуля.

К сожалению, я не нашел более достоверной информации об этом.

2