#ifndef Syntax für Include-Wachen in C ++

7

Ich bin gerade dabei, die Abschlussprüfung eines CS-Kurses zu absolvieren, und ich bin auf ein kleines (vielleicht großes?) Problem bezüglich der Syntax von C ++ #ifndef gestoßen.

Ich habe mir die Syntax für #infndef angesehen, als ich sie als #include-Wächter benutzt habe, und die meisten im Web scheinen zu sagen:

%Vor%

Aber die Tutorial-Folien meiner Klasse zeigen Beispiele als:

%Vor%

Ich fragte mich, was (wenn überhaupt) der Unterschied zwischen den beiden war. Die Prüfung wird mich höchstwahrscheinlich bitten, einen #include-Wächter zu schreiben, und ich weiß, dass konventionelle Weisheit darin besteht, einfach mit dem zu gehen, was der Lehrer sagt, aber wenn es einen Unterschied bei der Zusammenstellung gibt, würde ich es gerne wissen.

    
jayjyli 09.04.2012, 17:20
quelle

4 Antworten

17

Die übliche Vorgehensweise besteht darin, dies nicht zu tun und den Include-Guard in die Header-Datei zu platzieren, da dies die Wiederholung verringert. z.B.:

header.h

%Vor%

Genau das, was Sie als Makroname verwenden, hängt von Ihrem speziellen Codierungsstandard ab. Es gibt jedoch verschiedene subtile Regeln in den C- und C ++ - Standards, die Sie daran hindern, Kennungen zu verwenden, die mit Unterstrichen beginnen, 1 , also sollten Sie __HEADER_H__ vermeiden, nur um auf der sicheren Seite zu sein.

>

Es ist auch erwähnenswert, dass Sie etwas auswählen sollten, das mit nichts in Ihrer Codebasis kollidiert. Zum Beispiel, wenn Sie zufällig eine Variable namens HEADER_H an anderer Stelle (unwahrscheinlich, merke ich) haben, dann würden Sie mit einigen ärgerlichen Fehlern enden.

1. Siehe z.B. Abschnitt 7.1.3 des C99-Standards.

    
Oliver Charlesworth 09.04.2012, 17:21
quelle
5

Namen, die mit einem doppelten Unterstrich beginnen, sind für die Implementierung reserviert. Daher würde ich davon abraten, __SOMETHING in Ihren Include-Wächtern zu verwenden. Versuchen Sie auch, Namen zu wählen, die Kollisionen unwahrscheinlich machen. Es scheint also, dass die Tutorials Ihrer Klasse in mindestens zwei Punkten falsch sind. Sehen Sie sich zum Beispiel diesen humoristischen Artikel an.

    
juanchopanza 09.04.2012 17:25
quelle
1

Es gibt keinen Unterschied, wenn Sie Unterstreichung in Variablennamen nirgendwo sonst verwenden, es ist nur eine Namenskonvention.

Sie müssen nur etwas Einzigartiges setzen.

    
Marc 09.04.2012 17:23
quelle
0

Ein Argument dafür, die Include-Wächter in die Datei zu setzen, die den Header und nicht den Header selbst enthält, ist, dass der Compiler (speziell der Präprozessor) nicht geöffnet und gelesen werden muss, wenn die Datei bereits enthalten ist Datei erneut einbinden.

Das ist ein schwaches Argument. In der Praxis ist die eingesparte Zeit trivial und das Fehlerpotential ist groß.

In Ihrem Beispiel:

%Vor%

Sie zeigen uns nicht die #define HEADER_H . Ist es irgendwo in header.h ? Wenn ja, woher weißt du, dass der Autor von header.h HEADER_H als Name des Include-Guard-Makros verwendet hat? Was passiert, wenn sich später etwas anderes ändert?

Wenn Sie den Include-Guard in die Include-Datei einfügen, sollten Sie auch das Makro dort definieren:

%Vor%

Aber, wie andere Antworten bereits gesagt haben, ist es viel besser, den Wächter in den Header selbst zu setzen:

header.h:

%Vor%

und dann hat das Include einfach:

%Vor%

und hat eine weniger Information, über die man sich Sorgen machen muss.

    
Keith Thompson 09.04.2012 17:35
quelle

Tags und Links