# Определить область действия по всей библиотеке? - PullRequest
1 голос
/ 16 апреля 2010

Скажи, что у меня есть константа:

#define PI 3.14

Скажем, у меня есть статическая библиотека с несколькими заголовочными и исходными файлами. Если я объявлю это в заголовочном файле, будет ли его охват применяться ко всем исходным файлам? Или исходные файлы должны включать заголовок с объявлением PI?

Ответы [ 3 ]

4 голосов
/ 16 апреля 2010

Им нужно будет включить файл, содержащий #define PI 3.14, в противном случае препроцессор не будет читать строку #define, и в результате компиляция завершится неудачей.

В C ++ хорошим способом думать о процессе компиляции является то, что каждый отдельный файл C ++ сначала запускается через препроцессор, который принимает все операторы #define, #include и других препроцессоров и заменяет их в коде, а затем скомпилирован (на этом этапе файл C ++ и все, что было введено через #include, обрабатываются почти так, как если бы это был один очень большой отдельный файл), затем после этого компоновщик получает окончательный вывод на этапе предварительной обработки / компиляции для всего C ++ файлы и собирает их в один конечный выходной файл. Препроцессор (который обрабатывает определения) работает до стадии компиляции, а не во время компоновки.

1 голос
/ 16 апреля 2010

Определение должно быть включено в каждый модуль.

Технически, у него нет «области видимости». Это только операция замены текста, которая происходит до компиляции. Вы также можете посмотреть в настройках компилятора способ определения определений препроцессора. Часто это настройки проекта, доступные через вашу среду IDE.

0 голосов
/ 16 апреля 2010

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

...