Wann ist es sinnvoll, den gleichen Header mehrmals in eine Datei aufzunehmen? [Duplikat]

8

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:

  • Pseudotemplates in C, wo Template-Parameter durch Präprozessor-Definitionen ersetzt werden. Es kann ohne Einschlüsse gemacht werden, aber Funktionen können zu groß oder zu zahlreich sein, so dass eine separate Datei sinnvoll wäre.
  • Block-für-Block-Struktur / Klassenkonstruktion (Verkettung von Stücken). Es kann helfen, die Vererbung in C zu emulieren und Code-Duplizierung zu verhindern, wenn Strukturen mit gemeinsamen Elementen definiert werden.
  • Look-up-Tabellen und andere Kompilierungszeit-Datenstrukturen (wiederum mit Hilfe von Präprozessor-Definitionen).
ostappus 24.07.2014, 20:44
quelle

2 Antworten

7

#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.

%Vor%

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%     
SHR 24.07.2014, 21:37
quelle
1

Das 'Standard' Beispiel ist der <assert.h> Header. Der Effekt der Aufnahme hängt vom Wert von NDEBUG ab:

%Vor%

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.

    
Jonathan Leffler 24.07.2014 23:41
quelle

Tags und Links