Запретить включение заголовков в тот же файл в C - PullRequest
0 голосов
/ 04 февраля 2019

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

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

a_1.h, b_1.h

и

a_2.h, b_2.h

Я хочу предотвратить включение файлов _1 и _2 в один файл, независимо от того, были ли они

a_ or b_

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

Помните, что ЛЮБОЙ другой файл в процессе сборки может содержать заголовок.При типичном include guard: #ifndef MYHEADER \n #include MYHEADER код заголовка вставляется только в первом экземпляре.После этого компилятор съел его и запомнил, и больше не нужно его включать.Думайте о компиляции, как о ВСЕХ исходных кодах в одном файле и превращении их в двоичный(Вы знаете, «компилирование», как сложение в кучу).Так что это не «в тот же файл», это «в той же сборке».

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

#ifndef PPC_e6500
#define PPC_e6500
#ifdef LINUX
#error This processor ain't big enough for the both of us, Tux. This here's 8548 territory!
#endif

Это не удастся построить, и вы сможете выяснить, кто совершил любую ужасную вещь, которая пыталась нацелить на две цели одновременно.

0 голосов
/ 04 февраля 2019

Предполагая, что смешивание заголовков _1 и _2 является ошибкой, которую необходимо отловить, простой способ ее отловить - определить и проверить защитные макросы для проверки смешанного использования этих заголовков и использовать * 1003.* директива об ошибках* и #if HEADER_SET != 2.

...