March 17th, 2020

Множественное включение заголовочного файла

Перечитываю раздел «Ошибка повторения включений» в учебнике Лафоре (стр.607-608).

Сначала автор напоминает о своей же рекомендации не вписывать в заголовочные файлы определения функций и глобальных переменных (рекомендуется держать в заголовочных файлах только объявления функций и глобальных переменных во избежание нарушения правила одного определения, описанного в предыдущем посте на эту тему; это нарушение возникнет, если заголовочный файл с определениями указанных программных элементов включить в несколько исходных файлов многофайловой программы). Цитата:

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


И тут же, на следующей странице, автор приводит пример (иллюстрирующий ошибку при включении в исходный файл одного и того же заголовочного файла несколько раз), в котором вписывает в заголовочный файл определение глобальной переменной. Цитата:
// файл headtwo.h
int globalVar;

Выглядит это странно, сбивает с толку. Понятно, что это сделано для иллюстративных целей. Но можно было бы придумать более приближенный к практике пример. Наверное, следовало бы вместо определения глобальной переменной использовать определение структуры или класса. Ведь при работе с межфайловыми классами определения этих классов обычно помещают в заголовочный файл в отличие от определений функций и глобальных переменных.

Например, в статье википедии, посвященной «include guard» (примерный перевод на русский: «защитное условие во включаемом файле») в этом случае для примера использовано определение структуры:
https://ru.wikipedia.org/wiki/Include_guard

Цитата:
// файл grandfather.h
struct foo {
    int member;
};

Добавление переменной к пространству имен

Цитата из учебника Лафоре (стр.611 перевода на русский, стр.649 оригинала):

You can place declarations outside a namespace that behave as if they were inside it. All you need is the scope resolution operator and the namespace name:

namespace beta
{
    int uno;
}

int beta::dos;

Here, both uno and dos are declared in the namespace beta.


Интересно, откуда Лафоре это взял?

У меня (компилятор среды «Visual Studio Community 2017») такое не работает. Выдает ошибку:
error C2039: dos: не является членом "beta"

В интернетах пишут, что такого в стандарте C++ нет:
https://www.linux.org.ru/forum/development/11941687
https://www.cyberforum.ru/cpp-beginners/thread1278918.html