Должны ли охранники включения быть уникальными даже между пространствами имен? - PullRequest
2 голосов
/ 04 марта 2011

Я использую одно и то же имя класса в двух пространствах имен, скажем, A и B. Должны ли охранники включения быть уникальными при объявлении классов с разными пространствами имен?

Я имею в виду, не может быть двух имен файлов AFile.h (в разных каталогах) с одними и теми же элементами защиты и объявлением разных пространств имен?

Файл 1:

# ifndef AFILE_H

#определить AFILE_H

пространство имен A {

class CAFile

{...

};

};

# endif

Файл 2:

# ifndef AFILE_H

# определить AFILE_H

пространство имен B {

класс CAFile

{...

};

};

# endif

Ответы [ 4 ]

10 голосов
/ 04 марта 2011

Ваши охранники должны отличаться, если некоторый код (прямо или косвенно) должен видеть и A :: CAFile, и B :: CAfile.

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

Посмотрите на такие вещи, как файлы Boost,у них есть некоторые соглашения для охранников заголовка (если я правильно помню).

5 голосов
/ 04 марта 2011

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

0 голосов
/ 04 марта 2011

Лично я использовал #pragma once, потому что он поддерживается компиляторами, которые мне нужны, и вы можете избежать проблем, о которых вы здесь упоминаете.Если вы хотите использовать #include охранников, то вам, возможно, придется проявить смекалку.В противном случае #include ing Foo/header.h может не работать, поскольку вы уже #include d Bar/header.h.

. В других случаях я не согласен с руководством по стилю, но Google рекомендует <PROJECT>_<PATH>_<FILE>_H_.Хотя это означает, что если вы копируете файлы по разным путям, вам придется обновить #include guard.

0 голосов
/ 04 марта 2011

Короче, это, наверное, хорошая идея.Вот как GCC справляется со своими задачами ...

#ifndef _GLIBCXX_VECTOR
#define _GLIBCXX_VECTOR 1

Я не знаю, как использовать пространство имен, скажем, но защита include должна быть уникальной для вашего упакованного интерфейса (который может находиться в одном пространстве имен илираспространяться по многим).

...