В этом нет ничего таинственного (но может быть немного трудно отследить, где они определены - но только немного). Они определены в заголовках, которые являются частью библиотеки, и они принимают разные определения в зависимости от того, как компилятор настроен для текущего запуска. В частности, эти макросы, по-видимому, в основном связаны с тем, настроен ли текущий прогон для /clr:pure
.
_CRTIMP_PURE
определено как __declspec(dllimport)
, если вы связываетесь с версией DLL среды выполнения C (а не сборкой с /clr:pure
), и определено иначе.
Если ваша библиотека не является DLL (или если она не обязательно будет DLL, когда конфигурируется среда выполнения DLL), вам не следует ее использовать. Вы, вероятно, не должны использовать его в любом случае, потому что вам нужно определить его по-другому, когда строит вашу библиотеку, чем когда ваша библиотека используется (это то, что делает Microsoft, когда они создают библиотеки времени выполнения C).
__CLR_OR_THIS_CALL
используется библиотеками Microsoft для объявления функции с __clrcall
, если вы строите с /clr:pure
(указывая, что эти функции будут вызываться только из управляемого кода - компилятор может выполнить определенные оптимизации в этом случае кажется).
Наконец, _EXCEPTION_INLINE
используется, чтобы сделать функции-члены class exception
inline
при сборке с /clr:pure
.
Итак, суть в том, что не используйте __CLR_OR_THIS_CALL
или _EXCEPTION_INLINE
, если только вы не планируете поддерживать /clr
для своей библиотеки, и вам, вероятно, не следует использовать _CRTIMP_PURE
в своей реализации, но, вероятно, следует использовать что-то похожее по вашему собственному усмотрению и под вашим собственным контролем.