Отменить определение уже включенного заголовка - PullRequest
0 голосов
/ 16 февраля 2011

Я хочу проверить заголовок в моем исходном файле и, если он уже определен, я хочу отменить его определение.

Возможно ли это?

Ответы [ 5 ]

1 голос
/ 16 февраля 2011

Вы имеете в виду, что хотите гарантировать, что заголовочный файл включается один раз и только один раз? Стандартное решение для этого заключается в использовании include guard .

Т.е. окружить содержимое вашего заголовка с

#ifndef MY_HEADER // a unique identifier for each header
#define MY_HEADER

...

#endif

Это гарантированно будет работать на всех платформах.Некоторые компиляторы также предоставляют #pragma для достижения того же эффекта с меньшими хлопотами, например, в Visual C ++ вы можете добавить

#pragma once

в начале вашего заголовочного файла.

1 голос
/ 16 февраля 2011

#undef является противоположностью #define и фактически отменяет его.

Это очень полезно, когда вам нужен макрос для какой-то задачи, но не хочет "загрязнять" таблицы символов

// referencing FOO is an error (not yet defined)

#define FOO(arg_) ....

FOO(A)
FOO(B)
FOO(C)

#undef FOO

// referencing FOO now is an error (not defined)

Нельзя отменить директиву #include.

1 голос
/ 16 февраля 2011

«включая» что-то в c / c ++ по существу означает: заставьте препроцессор скопировать и вставить #include <file> непосредственно в ваш исходный код (или лучше: предварительно обработанную версию вашего исходного кода).

Вы не можете отменить действие копирования и вставки.однако вы можете использовать «#undef», введенный этим действием копирования и вставки, но вы должны делать это для каждого атома, который вам не нравится, вы просто не можете #undef весь файл.

, чтобы проверить, еслиданный заголовок уже был включен, вы должны проверить, определено ли уже что-то из этого файла заголовка.большинство заголовков содержат так называемые «охранники», которые выглядят как

 #ifndef FOO_H
 #define FOO_H
 /* lots of code */
 #endif

для файла с именем «foo.h».Вы можете проверить «FOO_H» следующим образом:

 #ifdef FOO_H
 /* do your magic */
 #endif

пример:

 foo.h:
 #ifndef FOO_H
 #define FOO_H
 struct Foo { /* ... * };
 #endif

 bar.h:
 #include "foo.h"
 #ifdef FOO_H
 #undef Foo
 #endif

, но это может привести к большим головным болям, если вы не знаете, что именно вы делаете,Если ваша настоящая проблема заключается в том, что ваш компилятор жалуется на «уже объявленные вещи», то вы не защищаете заголовочные файлы от множественного включения ...

0 голосов
/ 16 февраля 2011

Вы можете остановить включение заголовка - самый простой способ - удалить или закомментировать директиву #include.

Вы также можете заранее определить своих охранников, чтобы включение было неэффективным.

foo.h
#ifndef __FOO_H
#define __FOO_H

/* contents of foo.h */

#endif /* __FOO_H */


foo.cpp
#define __FOO_H
#include "foo.h"
/* contents of foo.cpp */

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

Если вам действительно нужна только часть файла, лучше разбить файл на две части.

0 голосов
/ 16 февраля 2011

Вы не можете делать то, что, кажется, хотите сделать. Если вы не хотите, чтобы заголовок был включен, вы можете выбрать

не включайте его в первую очередь

условно включить его или нет через препроцессор, например

#ifdef INC_MY_HEADER
#include "myheader.h"
#endif

или если предположить, что заголовок имеет средства защиты заголовка, просто определите защиту заголовка перед включением заголовка, например. из строки комментария -DMY_HEADER или аналогичной

Если реальная проблема заключается в том, что у вас разные заголовки, определяющие вещи с одинаковыми именами, то вам, вероятно, нужно изучить пространства имен , чтобы избежать столкновений

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