Стандарт, по-видимому, подразумевает, что нет ограничения на число определений переменной, если оно не используется в odr (§3.2/3):
Каждая программа должна содержать ровно одно определение каждой не-встроенной функции или переменной, которая является odr-используемой в этой программе; не требуется диагностика.
Он говорит, что любая переменная не может быть определена несколько раз в пределах единицы перевода (§3.2/1):
Никакая единица перевода не должна содержать более одного определения любой переменной, функции, типа класса, типа перечисления или шаблона.
Но я не могу найти ограничение для не-odr-используемых переменных во всей программе. Так почему я не могу скомпилировать что-то вроде следующего:
// other.cpp
int x;
// main.cpp
int x;
int main() {}
Компиляция и связывание этих файлов с g++ 4.6.3, я получаю ошибку компоновщика для multiple definition of 'x'
. Честно говоря, я ожидаю этого, но поскольку x
не используется нигде (насколько я могу судить), я не вижу, как стандарт ограничивает это. Или это поведение undefined?