2015-11-05 2 views
7

AFAIK, символы полезны для предотвращения множественного разбора. Если оба хиджр и b включают c.h,Сфера символа C++

#ifndef C_H 
#define C_H 
... 
// c.h definition would go here 
... 
#endif 

предотвратит c.h от «разобранного» (я считаю, что это не правильное слово) более чем один раз.

Однако, я видел что-то вроде

#ifdef WIN32 
... 

в коде других людей. Этот символ должен быть определен где-то в другом месте, потому что поиск

#define WIN32 

в целом проект возвращается пустым. Мой вопрос: где эти символы действительно определены? Оставляет ли ОС что-то похожее на пул символов, которые могут использоваться различными программами для запроса свойств ОС или других процессов?

+0

Можно установить определения препроцессора из параметров командной строки/ide. В VS смотрите «C/C++ -> Препроцессор». –

ответ

5

Есть два варианта, где те, которые не находятся в самом коде может происходить из:

  1. Самой свита компилятора устанавливает его по умолчанию при запуске компиляции коды.
  2. Вы даете компилятору (или препроцессору, если быть точным) список этих определений при компиляции кода (или ваших предпочтений проекта IDE, когда вы используете IDE. Например, в Visual Studio 2013 вы найдете при открытии проекта> Свойства> Свойства конфигурации> C/C++> Препроцессор> Определения препроцессора).

В общем, эти определения используются не только по той причине, что вы описываете (включая защитные меры), но также для включения или выключения кода на основе платформы, для которой вы разрабатываете - например, вы можете иметь только ветви кода скомпилирован для окон, или только если вы используете 64-битный компилятор.

+0

Brilliant. Большое спасибо. – roymcclure

1

AFAIK это часть компилятора вы используете.

1

Компилятор Microsoft C++ внутренне определяет некоторые макросы, такие как WIN32, поэтому он не определен ни в каком конкретном заголовке. Поэтому, когда вы создаете исходный файл с VC++, материал внутри #ifdef WIN32 компилируется, но не на Linux gcc.

Также ваша номенклатура немного выключена - они называются макросами препроцессора, а не символами. Имена переменных, функций и т. Д. В вашем коде являются символами.

+0

Отлично, спасибо за подсказку. – roymcclure

1

Каждый компилятор имеет список определенных макросов. MSVC определяет WIN32, когда целью компиляции является 32-разрядная Windows.

+0

он также определяет WIN32 при таргетинге на 64-битную Windows, я считаю (потому что Microsoft) – kcraigie