Я читаю книгу C++ (C++-праймер), и теперь есть вещь, которую я не могу понять.
Почему, если у меня есть 2 разных файла cpp, и я объявляю & определить переменную с тем же именем в этих файлах, компилятор даст мне ошибку связи? Являются ли переменные локальными для файла?C++ Об переменных
ответ
Являются ли переменные локальными в файле? №
В файле cpp нет ничего особо особого, кроме файла h; когда вы компилируете файл cpp (скажем, стандартным образом, в .o), #include
, который втягивает файл h, просто вставляет h-файл в поток компиляции. Файлы заголовков в этом отношении являются организационными.
Вы можете поместить int foo;
в один файл cpp, а extern int foo;
в другой, скомпилировать каждого в объектный файл и связать их вместе. Второй файл может затем получить доступ к одному и тому же объекту в первом файле (факт, что extern int foo;
был загружен в файл cpp, действительно не имеет значения). По той же причине int foo;
, помещенный в два разных файла cpp, создает двусмысленность при их объединении.
Чтобы убедиться, что Int Foo в одном ЕП (составитель .o файл/.obj, если вы будете) действительно используется только этой единицы, вы можете сделать одну из двух вещей:
- Объявите foo object static, например:
static int foo;
Эта переменная невосприимчива к внешней связи; это действительно личное для одной единицы перевода. Поместите Int объект в безымянном пространстве имен, например:
namespace { // Foo is in a unique namespace for this object file int foo; }
Эта специальная конструкция создает уникальное пространство имен для каждой единицы перевода. Это приводит к тому, что каждый объект foo в объектных файлах может быть разным.
спасибо! Хорошее объяснение. Таким образом, целью файлов .h является дать знать компилятору, какие методы/функции/другие вещи находятся в других .cpp, а затем разрешить использовать их в любом .cpp, который вы хотите, правильно? –
Не совсем. Код в cpp и код в h выглядят идентично компилятору и обрабатываются одинаково. Тем не менее, файлы h - это место, где вы помещаете общие объекты; в этом случае объявления - 'extern int foo;'. Таким образом, любой, кто хочет использовать ваш int в вашем файле cpp, может # включить ваш h-файл и который вводит 'extern int foo;' в свой код. Это для вашей выгоды, а не для компилятора. –
Если вы объявите переменные с помощью ключевого слова static
, они будут локальными для соответствующих единиц компиляции, и вы не получите ошибку. В противном случае они являются глобальными и должны быть доступны для всей программы, следовательно, вы получите ошибку.
- 1. VS2015 или ошибка C++? Об определении переменных
- 2. Соглашение об именах - подчеркивание в переменных C++ и C#
- 3. Вопрос об установке переменных класса
- 4. Об ограничении глобальных переменных JavaScript
- 5. Соглашение об именах переменных Python
- 6. Простая статья Javascript об переменных
- 7. Область переменных переменных C++
- 8. Как изменить рекомендуемое соглашение об именах переменных C#?
- 9. Действительно действительно базовый вопрос Obj-C об передаваемых переменных экземпляра
- 10. Об именах переменных областей в тензорном потоке
- 11. Соглашения об именах переменных экземпляра в какао
- 12. Мысли о соглашениях об именах переменных/функций
- 13. Имея вопрос об отправке переменных в subshell
- 14. Каково правильное соглашение об использовании корпуса для переменных C# и переменных экземпляра?
- 15. Аргумент переменных в C
- 16. Путаница об переменных окружения в python
- 17. PHP об ошибках с помощью переменных
- 18. Смешение об объеме переменных в С
- 19. Вопросы об автоматических переменных в make-файле
- 20. Общие сведения об объектных переменных VBA
- 21. Соглашения об именах для переменных «число foos»
- 22. Соглашения об именах для переменных параметра функции?
- 23. Использование переменных в заявлении об обновлении MongoDB
- 24. Назначение сообщения об ошибках переменных в Python
- 25. Объявление об умножении/определение глобальных переменных
- 26. Объявление об ошибке или диапазон переменных
- 27. Получение информации об агрегировании jmeter в переменных
- 28. Соглашения об именах для JSON-сериализуемых переменных
- 29. Преобразование переменных C++
- 30. C++-членная семантика переменных
Можете ли вы привести пример? –