Какие типы заголовочных файлов не должны быть защищены от многократного включения?

Я прочитал исходный код dcmtk и нашел комментарий в ofstdinc.h:

// this file is not and should not be protected against multiple inclusion

И какие виды заголовочных файлов НЕ СЛЕДУЕТ быть защищенным от многократного включения?

15

Решение

Препроцессорное метапрограммирование. То есть использование включенного файла в качестве некой функции времени компиляции, которая выполняет какую-то задачу. Аргументами функции являются макросы. Например, у файла, который вы связали, есть раздел, который выглядит так:

// define INCLUDE_STACK to include "ofstack.h"#ifdef INCLUDE_STACK
#include "dcmtk/ofstd/ofstack.h"#endif

Так что, если бы я хотел включить "ofstack.h"Я бы сделал так:

#define INCLUDE_STACK
#include "ofstdinc.h"#undef INCLUDE_STACK

Теперь, представьте позже, кто-то хочет использовать этот конкретный раздел заголовка:

// define INCLUDE_STRING to include "ofstring.h"#ifdef INCLUDE_STRING
#include "dcmtk/ofstd/ofstring.h"#endif

Поэтому они делают следующее:

#define INCLUDE_STRING
#include "ofstdinc.h"#undef INCLUDE_STRING

Если "ofstdinc.h" были включены охранники, это не будет включено.

12

Другие решения

Одним из примеров являются заголовочные файлы, которые ожидают, что вы определите макрос. Рассмотрим заголовок m.h с

M( foo, "foo" )
M( bar, "bar" )
M( baz, "baz" )

Это может быть использовано в другом заголовке, например:

#ifndef OTHER_H
#define OTHER_H

namespace other
{
enum class my_enum
{
#define M( k, v ) k,
#include "m.h"#undef M
};

void register_my_enum();
}

#endif

и в каком-то другом файле (возможно, реализация):

#include "other.h"
namespace other
{
template< typename E >
void register_enum_string( E e, const char* s ) { ... }

void register_my_enum()
{
#define M( k, v ) register_enum_string( k, v );
#include "m.h"#undef M
}
}
12

Вы почти всегда хотите защитить от многократного включения. Единственный случай, когда вы не хотите этого делать, — это если вы делаете какие-то модные вещи с макросами C и поэтому ХОТИТЕ иметь возможность многократного включения для получения желаемого кода (у вас нет примера этого от руки).

0
По вопросам рекламы [email protected]