Schütze Konventionen in C [duplizieren]

8

Was ist der übliche Weg, um Ihre Include-Wachen einzurichten? Ich schreibe sie normalerweise als (zum Beispiel.h):

%Vor%

Bedeutet die Unterstreichung von Konvention? Ich habe widersprüchliche Informationen gesehen, als ich das gegoogelt habe. Muss der _EXAMPLE_H_ sogar mit dem Namen des Headers übereinstimmen?

    
cjubb39 25.06.2013, 21:06
quelle

2 Antworten

15
%Vor%

Ja. Es ist wichtig.

Bezeichner mit einem führenden Unterstrich gefolgt von einem Großbuchstaben sind für die Implementierung reserviert. Also, was Sie haben, würde undefined Verhalten verursachen.

Das Folgende ist die Spezifikation des C-Standards für die Benennung der Bezeichner ( Entwurf C11 ):

7.1.3 Reservierte Identifikatoren

  

Jede Kopfzeile deklariert oder definiert alle in ihr aufgeführten IDs   zugeordnete Unterklausel und deklariert oder definiert optional Bezeichner   aufgeführt in seiner zugehörigen zukünftigen Bibliothek Richtungen Unterabschnitt und   Identifikatoren, die immer entweder für eine Verwendung oder zur Verwendung als reserviert sind   Dateibereichsbezeichner.

     

- Alle Bezeichner, die mit einem Unterstrich und entweder einem beginnen   Großbuchstaben oder ein anderer Unterstrich sind immer für alle reserviert   verwenden.

     

- Alle Bezeichner, die mit einem Unterstrich beginnen, sind immer reserviert   zur Verwendung als Bezeichner mit Dateibereich sowohl im gewöhnlichen als auch im Tag   Namensräume.

     

- Jeder Makroname in einem der folgenden Unterklauseln (einschließlich der   zukünftige Bibliothek Richtungen) ist reserviert für die Verwendung wie angegeben, wenn einer der   die zugehörigen Header sind enthalten; sofern nicht ausdrücklich anders angegeben   (siehe 7.1.4). - Alle Bezeichner mit externer Verknüpfung in einem der   folgende Unterklauseln (einschließlich der zukünftigen Bibliotheksanweisungen) und   errno sind immer für die Verwendung als Kennungen mit externen reserviert   linkage.184) - Jede Kennung mit Dateibereich, die in einem der   folgende Unterklauseln (einschließlich der zukünftigen Bibliotheksanweisungen) ist   reserviert für die Verwendung als Makroname und als Bezeichner mit Dateibereich   im selben Namensraum, wenn einer der zugehörigen Header enthalten ist.

     

Keine anderen Kennungen sind reserviert. Wenn das Programm deklariert oder definiert   eine Kennung in einem Kontext, in dem sie reserviert ist (nicht als   erlaubt durch 7.1.4), oder definiert eine reservierte Kennung als Makroname,   Das Verhalten ist nicht definiert.

     

Wenn das Programm (mit #undef) eine Makrodefinition von einem entfernt   Bezeichner in der ersten oben aufgeführten Gruppe ist das Verhalten nicht definiert.

Ohne einen der obigen Punkte zu verletzen, kann der Name des include-Wächters alles sein und muss nicht der Name der Header-Datei sein. Aber die Konvention, die ich gesehen / benutzt habe, besteht normalerweise darin, denselben Namen wie den Namen der Header-Datei zu verwenden, so dass keine unnötige Verwirrung entsteht.

    
P.P. 25.06.2013, 21:24
quelle
-1

Es gibt keine absolute Anforderung, wie Wächter benannt werden. Es muss nicht mit dem Kopfzeilennamen übereinstimmen. Ich habe (und habe selbst) einige verwendet, die eine UUID verwenden, die im Wesentlichen aus einer zufällig erzeugten hexadezimalen Zeichenfolge besteht.

Technisch wie KingsIndian sagte, sind Kennungen, die mit Unterstrichen beginnen, reserviert:

  

Die Regeln, umschrieben von ANSI Sec. 4.1.2.1, sind:

%Vor%      

FAQ-Liste von comp.lang.c · Frage 1.29

Vielleicht entspannt der neue ISO C11 (?) Standard diese Regeln, aber das war schon eine Weile das Entscheidende.

    
Colin D Bennett 25.06.2013 22:58
quelle

Tags und Links

yii\base\ErrorException
Copied! Copy Stacktrace Search Stackoverflow Search Google Error

PHP Core Warningyii\base\ErrorException

PHP Startup: Unable to load dynamic library 'mongodb.so' (tried: /usr/lib64/php/modules/mongodb.so (/usr/lib64/php/modules/mongodb.so: cannot open shared object file: No such file or directory), /usr/lib64/php/modules/mongodb.so.so (/usr/lib64/php/modules/mongodb.so.so: cannot open shared object file: No such file or directory))

$_GET = [
    'id' => '352005',
    'url' => 'include-guard-conventions-in-c',
];

$_COOKIE = [
    'advanced-frontend' => '3b34c372cd1df049fd1f13dcb2311ce9',
    '_csrf-frontend' => '8538496c046adc03c8f1b2434eea7369c0ba9e0cb552d117234047be103ca507a:2:{i:0;s:14:"_csrf-frontend";i:1;s:32:"OSQcnurq-iTmnLb5pegPHsUfx4Ux0fxI";}',
];

$_SESSION = [
    '__flash' => [],
];