Использование препроцессора C для определения среды компиляции - PullRequest
2 голосов
/ 04 октября 2010

Я создаю приложение, которое состоит из драйвера Windows, написанного на C , и исполняемого файла пользовательского режима на C ++.Они оба используют общий заголовочный файл для определения нескольких макросов, констант, перечислений и т. Д. В версии C ++ я хочу включить все в пространство имен, что не поддерживается компилятором C .Есть ли переменная, которую я могу проверить для использования в качестве директивы препроцессора с Visual Studio, как в следующем примере?

#ifdef USING_CPLUSPLUS
namespace mynamespace{
#endif

    struct mystruct{
       ...
    };


#ifdef USING_CPLUSPLUS
}
#endif

Ответы [ 3 ]

8 голосов
/ 04 октября 2010

Ближайший макрос, о котором я могу подумать, это:

#if defined(__cplusplus)
6 голосов
/ 04 октября 2010

Для конкретного примера отличия компилятора C ++ от компилятора C разумным выбором является макрос __cplusplus, который определен стандартом C ++ и существует из-за побочных эффектов правил зарезервированных имен предложение, которое говорит об этом в стандартном C, никогда не будет предопределено компилятором C.

Каждый компилятор имеет набор предопределенных макросов, которые иногда полезны для различения хостов компиляции и целевых платформ.Одним из больших репозиториев таких макросов является Predef Project , где они собирают отчеты о максимально возможном количестве комбинаций компилятора, хоста и цели.

Редактировать: Разъяснение зарезервированной природы __cplusplus в C: Стандарт C всегда имеет зарезервированные идентификаторы, которые начинаются с двух подчеркиваний или одного подчеркивания, за которыми следует заглавная буква.Например, C99 в разделе 7.1.3 гласит:

«Все идентификаторы, которые начинаются со знака подчеркивания и либо с заглавной буквы, либо другого знака подчеркивания, всегда зарезервированы для любого использования.»,

и несколько других пунктов содержат сноску, которая читается частично

«Ключевые слова, определяемые реализацией, должны иметь форму идентификатора, зарезервированного для любого использования, как описано в 7.1.3.»

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

Однако C99 комитет по стандартам решил удостовериться, что ни одна реализация C не повредила очевидную полезность макроса, который можно использовать для отличия компиляции C от компиляции C ++.В разделе C.10 раздела 6.10.8 написано:

«Реализация не должна предопределять макрос _ _cplusplus и не должна определять его в каком-либо стандартном заголовке.»

Еготрудно понять более ясно, чем это.

0 голосов
/ 06 октября 2010

Эффективность,

__ cplusplus

mais si tu en cherches d'autres tu tuvera and référencement de ces variable ici:

predef.sourceforge.net

НУ

msdn.microsoft.com / EN-US / библиотека / b0084kay (VS.80) .aspx

...