Wozu dient solch eine #ifndef -Anweisung?

Gast #3551141
Lesenswert?

ganz einfach, stell Dir mal vor, Du bindest die Headerdatei zweimal ein, 
einmal in Modul 1 und dann in Modul 2.

Hast Du ein Programm mit beiden Modulen, dann würde die selbe 
Headerdatei zweimal eingebunden und es kommt zu 
Fehlermeldungen/Warnungen wegen doppelter Namensvergabe.

Also bedient man sich eines Tricks, man definiert eine Konstante und mit

äifndef -> if not defined

wird dann geprüft, ob die define-Anweisung schon existiert, dann wird 
die Anweisung innerhalb des Blocks

#ifndef


...


#endif

abgearbeitet, ansonsten nicht.
Gast #3551163
Lesenswert?

in der Datei avr/io.h steht höchstwahrscheinlich am Anfang genau so eine 
#ifndef-Anweisung, die überprüft ob avr/io.h schon einmal eingebunden 
wurde oder nicht.
Wenn sie bereits eingebunden wurde wird der folgende Block (also alles, 
was zwischen #ifndef und #endif steht) einfach übersprungen.
#3551203
Lesenswert?

Hugo Boss schrieb:
> ganz einfach, stell Dir mal vor, Du bindest die Headerdatei zweimal ein,
> einmal in Modul 1 und dann in Modul 2.
Module? Module sind in C einzelne Funktionen. Was hat eine Funktion mit 
einer Headerdatei zu tun?
1. In Funktionen werden keine Headerdateien eingebunden
2. Wenn eine Funktion zweimal vorhanden ist, hat man ein ganz anderes 
Problem

mfg.
Moderator Persönliche Seite #3551534
Lesenswert?

Im Übrigen sind Bezeichner, die mit einem Unterstrich gefolgt von einem
Großbuchstaben oder einem weiteren Unterstrich beginnen, grundsätzlich
reserviert für Compiler und (System-)Bibliothek.

In einem von einem Anwender gezimmerten Headerfile hat also ein
Bezeichner wie _PCF8574_H nichts verloren.  Stattdessen wählt man besser
die (offenbar zu einfach anmutende :) Variante PCF8574_H.
#3551568
Lesenswert?

Thomas schrieb:
> error in line 23: non portable pragma conversation

Was für einen Compiler benutzt du denn? Alle gängigen sollten damit klar 
kommen...

Clang                   Supported[5]
Comeau C/C++           Supported[6]
C++Builder XE3           Supported[7]
Digital Mars C++   Supported[8]
GCC                   Supported[9] (since 3.4[10])
Intel C++ Compiler   Supported[11]
Microsoft Visual C++   Supported[12]
Pelles C           Supported[13]
ARM DS-5           Supported[14]
IAR C/C++           Supported[15]
#3551713
Lesenswert?

Rufus Τ. Firefly schrieb:
> Jörg Wunsch schrieb:
>> rückwärtskompatibel bis zur Jungsteinzeit
>
> Das ist uncool.

Genau.
Da müsste sich ja der geneigte Jungprogrammierer ein Schema einfallen 
lassen, wie er die Makronamen bildet.

Im Ernst: ok, so ein #pragma hat schon seine Vorteile, wenn man 
Codegeneratoren schreibt. Auf der anderen Seite ist ein #pragma genau 
das: eine Möglichkeit, wie man Compilerspezialitäten unterbringen kann. 
#pragma ist zuallererst per Definition nicht portabel.
Gast #3552719
Lesenswert?

Rufus Τ. Firefly schrieb:
> Jörg Wunsch schrieb:
>> rückwärtskompatibel bis zur Jungsteinzeit
>
> Das ist uncool. Das könnte ja auch mit Compilern übersetzt werden, die
> kein C11 oder auch nur C99 unterstützen.

Ja, und es könnte dann auch mit Compilern übersetzt werden, die zwar C11 
oder C99 unterstützen, aber diese proprietäre Erweiterung nicht.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren