2014-09-06 2 views
1

Я читаю книгу C++ (C++-праймер), и теперь есть вещь, которую я не могу понять.
Почему, если у меня есть 2 разных файла cpp, и я объявляю & определить переменную с тем же именем в этих файлах, компилятор даст мне ошибку связи? Являются ли переменные локальными для файла?C++ Об переменных

+2

Можете ли вы привести пример? –

ответ

1

Являются ли переменные локальными в файле?

В файле cpp нет ничего особо особого, кроме файла h; когда вы компилируете файл cpp (скажем, стандартным образом, в .o), #include, который втягивает файл h, просто вставляет h-файл в поток компиляции. Файлы заголовков в этом отношении являются организационными.

Вы можете поместить int foo; в один файл cpp, а extern int foo; в другой, скомпилировать каждого в объектный файл и связать их вместе. Второй файл может затем получить доступ к одному и тому же объекту в первом файле (факт, что extern int foo; был загружен в файл cpp, действительно не имеет значения). По той же причине int foo;, помещенный в два разных файла cpp, создает двусмысленность при их объединении.

Чтобы убедиться, что Int Foo в одном ЕП (составитель .o файл/.obj, если вы будете) действительно используется только этой единицы, вы можете сделать одну из двух вещей:

  1. Объявите foo object static, например: static int foo; Эта переменная невосприимчива к внешней связи; это действительно личное для одной единицы перевода.
  2. Поместите Int объект в безымянном пространстве имен, например:

    namespace { // Foo is in a unique namespace for this object file int foo; }

Эта специальная конструкция создает уникальное пространство имен для каждой единицы перевода. Это приводит к тому, что каждый объект foo в объектных файлах может быть разным.

+0

спасибо! Хорошее объяснение. Таким образом, целью файлов .h является дать знать компилятору, какие методы/функции/другие вещи находятся в других .cpp, а затем разрешить использовать их в любом .cpp, который вы хотите, правильно? –

+0

Не совсем. Код в cpp и код в h выглядят идентично компилятору и обрабатываются одинаково. Тем не менее, файлы h - это место, где вы помещаете общие объекты; в этом случае объявления - 'extern int foo;'. Таким образом, любой, кто хочет использовать ваш int в вашем файле cpp, может # включить ваш h-файл и который вводит 'extern int foo;' в свой код. Это для вашей выгоды, а не для компилятора. –

1

Если вы объявите переменные с помощью ключевого слова static, они будут локальными для соответствующих единиц компиляции, и вы не получите ошибку. В противном случае они являются глобальными и должны быть доступны для всей программы, следовательно, вы получите ошибку.

Смежные вопросы