STL определяет защиту заголовков для своих заголовков? - PullRequest
4 голосов
/ 07 января 2020

Я хочу добавить некоторые удобные встроенные функции, используя std::string, в заголовок вместе с библиотечными функциями, которые используют const char *, но я не хочу включать <string>. Я хочу проверить с помощью #ifdef, включен ли <string>, и предоставить вспомогательные функции, если это так.

Вопрос: Являются ли имена защитников заголовков в заголовках STL одинаковыми для всех реализаций STL? В Visual Studio 2010 защита заголовка <string> составляет _STRING_.

Ответы [ 2 ]

15 голосов
/ 07 января 2020

Это BAD IDEA ™.

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

Что вы могли бы (должны?) Сделать, это документировать макрос, который пользователь должен определить, чтобы включить ваши std::string функции:

#ifdef MY_LIBRARY_ENABLE_STRING_FUNCTIONS
void print(std::string message);
#endif // MY_LIBRARY_ENABLE_STRING_FUNCTIONS

Если пользователь хочет их, они ' Вам потребуется:

#define MY_LIBRARY_ENABLE_STRING_FUNCTIONS
#include <my_library>

1) C ++ 17 содержит макрос __has_include(<filename>) (кредит acraig5075 для изучения этого мне), который не помогает, поскольку он возвращает, доступно ли включение, и нет, если оно было включено.

3 голосов
/ 07 января 2020

Самый надежный способ проверки, вероятно, будет использовать технику.

При этом, НЕ ДЕЛАЙТЕ ЭТОГО , все кричит против паттерна, когда Вы хотите определить, включен ли заголовок или нет, или порядок включений.

...