Ich habe mehrere Einfügungen desselben Headers in einer Datei gelesen und eine interessante Aussage gefunden ( Link ):
Es gibt ein paar Tricks mit Header-Dateien, die Sie absichtlich gemacht haben nehmen Sie es mehrmals auf (das ist tatsächlich nützlich Funktion).
Ich verstehe, dass diese Tricks in realen Projekten wahrscheinlich unerwünscht und verwirrend sind (besonders, da Leute Vorkehrungen gegen mehrere Einschlüsse treffen, wie einschließen Wächter und #pragma once
).
Aber trotzdem, was sind diese Tricks? Ich habe mir ein paar Ideen einfallen lassen, möchte aber einige Beispiele sehen (im Idealfall sicher und probiert).
Meine Gedanken:
#include "file"
bedeutet, dass Sie die Headerdatei nehmen und den gesamten Inhalt anstelle der #include
-Zeile einfügen.
Wir normalerweise haben Header für Typdefinitionen und zum Hinzufügen von Vorwärtsdeklarationen zu Quelldateien verwendet. Wenn Sie denselben Typ zweimal in einer Datei definieren (ein zirkuläres Include führt immer dazu), wird ein Kompilierungsfehler angezeigt. Daher verwenden wir #ifndef
oder #pragma once
. (oder beides)
Aber wir können auch einen sich wiederholenden Code und Makros einfügen und sie mehrmals einfügen, sogar in der gleichen Datei. In diesem Fall werden wir weder #ifndef
noch #pragma once
verwenden. Wenn Sie dies tun, müssen Sie besonders vorsichtig sein, und tun Sie es nur, wenn Sie wissen, was Sie tun.
Beispiel: Wenn in einem Betriebssystem eine bestimmte Systemfunktion (oder sogar ein AC-Makro wie: offsetof
) eine Reihe von Warnungen auslöst, stört es Sie, und Sie sind sicher, dass Ihr Code ist gut, aber Sie möchten nicht alle Warnungen deaktivieren, die Sie für das gesamte Projekt oder die Datei haben. Sie möchten es nur deaktivieren, wenn Sie die spezifische Funktion aufrufen.
Dadurch wird Ihr Code sehr schmutzig, besonders wenn Sie die Funktion mehrmals aufrufen.
Eine mögliche Lösung (ich behaupte nicht, dass es die beste ist ...) besteht darin, 2 Header zu erstellen, in einem die Warnungen zu unterdrücken und in dem anderen die Unterdrückung zu unterdrücken.
In diesem Fall könnte Ihr Code wie folgt aussehen:
%Vor% Das 'Standard' Beispiel ist der <assert.h>
Header. Der Effekt der Aufnahme hängt vom Wert von NDEBUG
ab:
Die Assertion in func1()
ist aktiv, es sei denn, etwas in der Kompilierungsumgebung hat NDEBUG
zu dem Zeitpunkt gesetzt, als <assert.h>
enthalten war. Die Assertion in func2()
ist aktiv, da NDEBUG
undefiniert war, wenn <assert.h>
enthalten war. Die Assertion in func3()
ist inaktiv, weil NDEBUG
definiert wurde, wenn <assert.h>
eingeschlossen wurde.
Nachdem ich das gesagt habe, habe ich diese Möglichkeit nie im wirklichen Leben benutzt, aber der C-Standard segnet (mandatiert) das gezeigte Verhalten.
Beachten Sie, dass dies nicht zufällig passiert; Das passiert, weil der Header bewusst so konstruiert wurde, dass er mehrere Male in einer einzigen TU (re) verwendet werden kann.
Tags und Links c c++ include header-files