Доступ к константным переменным в единицах перевода - PullRequest
2 голосов
/ 14 января 2011

В C ++ const переменные неявно скрыты от других единиц перевода. Можно ли это предотвратить?

Ответы [ 3 ]

7 голосов
/ 14 января 2011

Да, префикс определения с extern например.

extern const int x = 10;
3 голосов
/ 14 января 2011

Это может быть достигнуто с помощью ключевого слова extern:

// a.cpp
extern const int x = 10; // definition
// b.cpp
extern const int x;      // declaration

Эффект, который это даст, заключается в том, что вам не нужно будет перекомпилировать b, если значение константы изменится на a, но в то же время вы потеряете возможность использовать x в качестве постоянной времени компиляции. внутри b.cpp (т.е. вы не сможете писать int array[x];).

Если для этого нет очень веской причины, я бы предпочел, чтобы константа была определена в заголовочном файле и была включена во все единицы перевода, для которых она требуется;

// c.h
const int x = 10;
// a.cpp
#include "c.h"
// b.cpp
#include "c.h"

Вам придется перекомпилировать все единицы перевода, которые зависят от константы, с каждым изменением, но вы сможете использовать ее во время компиляции во всех единицах перевода. Ограничением этого подхода является то, что если вы измените константу и перекомпилируете только некоторые единицы перевода, значение константы будет непоследовательным (это нарушение ODR).

3 голосов
/ 14 января 2011

Используйте ключевое слово extern:

extern const int x = 10;

Это заставляет переменную иметь внешнюю связь.

Для переменных области пространства имен это обычно значение по умолчанию, и вы бы использовали static (или, лучше, анонимное пространство имен) для принудительной внутренней связи.

На самом деле я не знал, что переменные пространства имен const по умолчанию имеют внутреннюю связь, пока я не прочитал ваш вопрос и не попробовал его, так что спасибо за это. Узнай что-то новое каждый день!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...