Ключевые слова из стандартной библиотеки Visual C ++ - PullRequest
1 голос
/ 10 марта 2012

Я хотел написать Unicode-версию std :: exception и std :: runtime_error.
Поэтому я подумал, что может быть лучше, чем просто взять реализации из стандартной библиотеки C ++ и изменить их для поддержки Unicode.

Итак, я поднял заголовки исключений и stdexcept в Visual C ++, скопировал код, внес свои изменения.

Дело в том, что я не смог получитьэто ссылка, если я не удалил _CRTIMP_PURE.Я также удалил префикс _EXCEPTION_INLINE __CLR_OR_THIS_CALL из всех функций-членов.

Он работает, но мне очень любопытно, что все эти вещи сделали.
_EXCEPTION_INLINE он буквально определен прямо над ним как #define _EXCEPTION_INLINEи мои навыки поиска в Google не могут найти никакой документации о том, что они делают.

Итак, кто-нибудь знает, для чего они предназначены?И почему он не связывался, пока я не удалил префикс _CRTIMP_PURE из класса?

Ответы [ 2 ]

2 голосов
/ 10 марта 2012

В этом нет ничего таинственного (но может быть немного трудно отследить, где они определены - но только немного). Они определены в заголовках, которые являются частью библиотеки, и они принимают разные определения в зависимости от того, как компилятор настроен для текущего запуска. В частности, эти макросы, по-видимому, в основном связаны с тем, настроен ли текущий прогон для /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 в своей реализации, но, вероятно, следует использовать что-то похожее по вашему собственному усмотрению и под вашим собственным контролем.

1 голос
/ 10 марта 2012

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

Нет проблем с дублированием интерфейса из std::exception и друзей, и вы можете найти вдохновение в реализации Visual Studio. Но ваша реализация должна использовать только официально задокументированные функции языка / библиотеки.

...