2016-04-06 7 views
0

Zum Beispiel, hier ist ein „Hallo, Welt“ Programm ohne stdio.h enthalten:Schreiben Prototypen statt # include <stdio.h>

int puts(const char *str); 

int main(void) 
{ 
    puts("hello, world"); 
} 

Ich denke sogar, das ein guter Programmierstil sein kann, wenn mein Programm wird immer länger und länger , denn alle aufgerufenen Funktionen sind am Anfang explizit aufgeführt.

Meine Frage ist also: Neben der Bereitstellung von Prototypen für Standard-Bibliotheksfunktionen, was sonst macht #include <stdio.h>?

+0

Bestimmte Funktionen können als Makros definiert werden – user3159253

+1

Sie alle Dinge nachschlagen kann 'stdio.h' bietet durch den C99-Standard gerade Abschnitt ** 7,21 Eingang/Ausgang' ' ** –

+0

Es ist eine sehr schlechte Idee zu erklären, externe Funktionen selbst statt die entsprechende Header-Datei enthalten. Es ist nicht klar, welches Problem du denkst, dass du es löst, aber ich kann dir versichern, dass du es nicht bist. –

Antwort

6

Die (nicht normative) Appendix J.2 des C11 Standardentwurf der unter Beispiele für undefinierten Verhalten folgenden aufgeführt:

- eine Funktion Objekt, Typ oder Makro, das als deklariert angegeben wird oder durch eine Standard-Header definiert ist, bevor ein Header verwendet, die erklärt oder definiert sie enthalten ist (7.1.2)

wie jedoch von Keith Thompson wies darauf hin, die 7.1.4p2 sagt:

2 Sofern eine Bibliotheksfunktion ohne Verweis auf einen in einem Header definierten Typ deklariert werden kann, ist es auch zulässig, die Funktion zu deklarieren und ohne den zugehörigen Header zu verwenden.

mit So puts ohne einschließlich <stdio.h> kann in der Tat in standardkonformer Weise erfolgen. Sie können jedoch fputs nicht deklarieren, da es einen Zeiger auf FILE als ein Argument erfordert, das Sie in einer streng übereinstimmenden Weise nicht ausführen können.

Darüber hinaus könnte puts auch ein Makro in Anwesenheit von <stdio.h> sein und zu etwas schneller in der Gegenwart des Headers erweitern.

Alles in allem ist die Anzahl der Funktionen, die richtig deklariert werden können, ohne Header zu enthalten, nicht so groß. Wie für die Funktionen, die einige Typen aus den Headern verwenden - wenn Sie mit Sprache-Anwalt Tag über C fragen, kommt die Antwort aus dem Standard und der Standard ist ziemlich offen über dies: tun Sie es nicht, oder Ihre Programm wird nicht streng entsprechen, Zeitraum.

+2

Aber 7.1.4p2 ist normativ: "Sofern eine Bibliotheksfunktion ohne Bezugnahme auf einen in einem Header definierten Typ deklariert werden kann, ist es auch erlaubt, die Funktion zu deklarieren und ohne ihren zugehörigen Header zu verwenden." –

+0

@KeithThompson danke, verpasst es irgendwie, updoted deins. –

5

<stdio.h> definiert unter anderem den Typ FILE. Sie können keine Funktion portabel aufrufen, die einen FILE*-Parameter übernimmt oder ein FILE* Ergebnis ohne #include <stdio.h> zurückgibt.

Und es gibt wirklich keinen guten Grund, irgendwelche der Funktionen selbst zu deklarieren, anstatt die Überschrift einzubeziehen.

1

Bei Verwendung eines geeigneten Programmentwurfs werden alle Prototypen öffentlicher Funktionen in Headerdateien platziert, und alle Funktionsdefinitionen werden in c-Dateien platziert. So schreiben Sie C-Programme, Punkt.

Es ist die de-facto-Standard-Art der C-Programmierung und keine Profis verwenden ein anderes Design.

Ihre persönliche Präferenz ist hier nicht relevant, und auch keine Schleifenlöcher im C-Standard, mit denen Sie ein anderes Design erstellen könnten. Sie sollten Ihre C-Programme auf die gleiche Weise schreiben wie der Rest der Welt.