Forum: PC-Programmierung "Hallo Welt" Beispiel aus Visual C++


von Ralf (Gast)


Lesenswert?

Hallo Zusammen, ich habe einige Fragen zu einem "Hallo Welt" Programm.
Man kann sich das automatisch aus Visual C++ erstellen lassen:

#include "stdafx.h"

int main(int argc, char* argv[])
{

  printf("Hallo Welt!\n");

  return 0;
}

1. Warum wird als Header nicht der "Standart" <stdio.h> verwendent.
Ich habe in die "stdafx.h" reingeschaut. Nur ich verstehe nicht so
ganz den Code darin.

2. Warum hat die main() Funktion die Parameter "int argc" und "char*
argv[]" und was bedeuten die?

Danke für Antworten!

von Rufus T. Firefly (Gast)


Lesenswert?

stdafx.h ist eine Include-Datei, die das Buildsystem der Microsoftschen
C++-Compiler verwendet, um mit präcompilierten Headerdateien arbeiten
zu können. Die helfen bei größeren Projekten die Übersetzungszeit zu
reduzieren.

Niemand zwingt Dich dazu, diese Datei zu verwenden. Wenn Du allerdings
mit einem automatisch erzeugten VC-Projekt arbeitest, solltest Du die
Verwendung von präcompilierten Headerdateien abschalten, sonst gibt es
erst recht unverständliche Fehlermeldungen.

Die Argumente von main sind im C-Standar_d_ festgelegt.
Das eine ist die Anzahl der übergebenen Kommandozeilenargumente, das
zweite ein Array von Pointern auf die einzelnen
Kommandozeilenargumente. Das erste Argument ist i.d.R. der Name des
Programmes selbst.

Diese Dinge sind in abermilliarden von C-Tutorials beschrieben; Du
solltest Dir vielleicht etwas grundlegende Literatur über C
durchlesen.

Literaturempfehlung: Kernighan&Ritchie, Programmieren in C, zweite
Auflage, Hanser Verlag

*) Fast kontextfreie Fußnote:
Mit der Art des Stehens ("standart") hat das übrigens gar nichts zu
tun, aber wer versteht diese Bemerkung schon?



1) hat nichts mit einer Art des Stehens zu tun.

von Chris (Gast)


Lesenswert?

Das ist übrigens ein äußerst schlechtes Beispiel für C++, da printf
bekanntlich eine C-Funktion ist (und in C++ meines Wissens nach im
namespace std liegt). Diese Funktion darf aber nur aufgerufen werden,
wenn man vorher sync_with_stdio() auf die iostreams aufgerufen hat
(o.ä.), da sich ansonsten zwei verschiedene Puffer gegenseitig in die
Quere kommen könnten.

Korrektes "Hello-Word" in C++:

#include <iostream> // nicht iostream.h (den gibts nicht)

int main()
{
    std::cout << "Hello World!" << std::endl;
}



return 0 ist in C++ bei main() unnötig (genauso unnötig wie auto vor
lokalen Variablen).

von Chris (Gast)


Lesenswert?

Hm, irgendwie geht aus dem Posting des OPs nicht klar hervor, ob er nun
C oder C++ programmieren möchte. Haben deine Dateien die Endung .c oder
.cpp?

von Rufus T. Firefly (Gast)


Lesenswert?

Die Tatsache, daß der MS-Codegenerator stdafx.h eingebunden hat, lässt
vermuten, daß es sich um c++ handeln könnte. AFX ist ein MS-internes
Kürzel, das aus der Urzeit der MFC stammt (was eine übelbeleumundete
Klassenbibliothek ist).

    "return 0 ist in C++ bei main() unnötig (genauso unnötig
    wie auto vor lokalen Variablen)."

Wenn main mit einem Rückgabewert deklariert ist, sollte dann nicht -der
Orthogonalität halber- der Compiler dies abweisen? Das Schlüsselwort
"auto" ist in der Tat so entbehrlich wie ein Unternehmensberater ...

von Ralf (Gast)


Lesenswert?

Programmieren möchte ich in C. Ich habe mir das Buch "C - Einführung
und professionelle Anwendung" von Peter Prinz und Ulla Kirch-Prinz
angeschafft. Anbei gab es zwei kostenlose Compiler: Gnu C/C++ und
Microsoft Visual C++ Autoren Edition. Mit dem Buch bin ich bisher sehr
zufrieden.

@Rufus
Wer Schreibfehler findet darf sie behalten! Trotzdem danke für die
ausführliche Erklärung.

von Chris (Gast)


Lesenswert?

> Wenn main mit einem Rückgabewert deklariert ist, sollte dann nicht
> -der Orthogonalität halber- der Compiler dies abweisen?

In C ist "return 0;" Pflicht, in C++ nicht mehr; wenn nichts dasteht,
nimmt der Compiler 0 als Rückgabewert an. Für Anfänger ist es aber
vermutlich nicht verkehrt, erstmal return auch bei main() zu benutzen.
Sonst besteht die Gefahr, irgendwann auf die "void main()"-Schiene zu
kommen, was vom Standard nun überhaupt nicht mehr abgedeckt wird.

Ansonsten ist es eher Geschmackssache, ob man bei main() return
verwendet oder nicht.

von Chris (Gast)


Lesenswert?

@Ralf:
Du solltest bei Visual C++ ein "leeres Projekt" (also eins ohne jede
vorgegebene Quellcode-Datei) erstellen. So verhinderst du am
elegantesten die MFC- und "stdafx"-Einbindung und ersparst dir eine
Reihe Probleme.

Du erstellst also ein "leeres Projekt"; als nächstes fügst du dem
Projekt eine .c-Datei hinzu, in du den Code schreibst (den mit stdio.h
aus deinem C-Buch). Wichtig ist die Endung ".c". Falls die Endung
.cpp ist, wird der C++-Compiler aufgerufen, was bei einigen
Codebeispielen zu Fehlern führen dürfte.

von Ralf (Gast)


Lesenswert?

@Chris

Super! Danke, so hat es funktioniert. Ich probierte zuerst den Code in
einer .cpp Datei, was aber leider nicht geklappt hat. Der Code aus der
automatisch generierten Beispieldatei hat mich dann doch etwas
verwirrt, da Pointer erst im 13. Kapitel kommen und ich erst im 2. bin
:-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.