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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.