Hi,
entweder ich habe einen revolutionären Compilerbug unter VisualStudio
2008 gefunden oder ich bin einfach nur zu blöd.
Folgendes C (kein C++) - Konsolenprojekt lässt sich nicht kompilieren.
Es erscheint folgender Compilerfehler:
error C2143: Syntaxfehler: Es fehlt ';' vor 'Typ'
Hier der Code wo es nicht funktioniert
1
#include<stdio.h>
2
#include<string.h>
3
4
intmain()
5
{
6
charmyString1[10];
7
myString1[0]='a';
8
charmyString2[10];//<- Hier Fehler!
9
return0;
10
}
Dies aber geht:
1
#include<stdio.h>
2
#include<string.h>
3
4
intmain()
5
{
6
charmyString1[10];
7
charmyString2[10];
8
myString1[0]='a';
9
return0;
10
}
Ich verstehs nicht. Jemand von Euch?
Gruß
Bernhard
Ja, das ist der Unterschied zwischen C und C++. In C++ dürfen
Variablendeklaration an fast jeder Stelle gemacht werden.
In C nur zu Begin eines Blockes!
Auch folgendes geht in C nicht
for (int i=0; i<10; i++)
ist aber in C++ zulässig.
Je nach Compiler Einstellung kann es sein dass Definitionen immer zuerst
ergolfen müssen bevor eine Zuweisung vorgenommen wird.
Evtl. gilt das auch nur für MISRA oder ANSI-C, aber da bin ich mir nicht
mehr sicher.
Danke! Nun ist alles klar. Aber wiedermal typisch Compiler: Behinderte
Fehlermeldungen mit dem keiner was anfangen kann!!!
Aber das Forum ist echt Super!
Gruß
Bernhard
Die Variante, das du in C die Variablen erst mitten im Code deklarierst,
gibt es erst ab C99 Standard. Den unterstützt der Visual Studio Compiler
aber nicht.
Bernhard N. schrieb:
> Ok, danke.>> Ist denn folgendes erlaubt?
Durch die { beginnt hier ein Block.
Und da Variablendefinitionen am Beginn eines Blocks erlaubt sind ...
PS: Es gibt keine IF-Schleife.
Das Wesen einer Schleife besteht darin, dass Code (potentiell)
wiederholt abgearbeitet wird. Diese Eigenschaft ist es, die eine
Schleife zu einer Schleife macht.
Bei einem if wird nichts wiederholt. Da wird ausgewählt.
Ach noch was: Ich frage mich ob diese Probleme evtl.bei der
Programmierung von µC relevant sind. Ich nutze AVR Studio zusammen mit
dem AVR GCC Compiler. Nutzt der den C99 Standart? Denn ich nutze Visual
Stio. nur zum Üben und Testen um wieder in C reinzukommen. Ich komme von
C++.
Gruß
Bernhard
Bernhard N. schrieb:
> Danke! Nun ist alles klar. Aber wiedermal typisch Compiler: Behinderte> Fehlermeldungen mit dem keiner was anfangen kann!!!
F1 drücken und lesen... SCNR
http://msdn.microsoft.com/en-us/library/0afb82ta.aspx
1
In a C program, variables must be declared at the beginning
2
of the function, and they cannot be declared after the function
Klaus schrieb:
> Keine vernünftiger Compiler benutzt heute einen so veralteten> C-Standard! Und wenn er es doch tut: Ab in die Tonne mit dem Mist!
Wahrscheinlich reicht es aus, den entsprechenden Sprachstandard
einzustellen. Aber das ist natürlich unzumutbar, also ab in die Tonne.
Sollen die den Compiler gefälligst so einstellen, dass er auch ohne mein
zutun alles richtig macht.
In C99 dürfen Deklarationen und Anweisungen auch innerhalb eines Blocks
gemischt werden (wie in C++).
Deswegen zeigt der GCC in dem Beispiel keinen Fehler an. Wenn man ihn
mit -std=c89 und -pedantic auf den alten Standard im Oberlehrermodus
umschaltet, kommt
test.c:8: warning: ISO C90 forbids mixed declarations and code
test.c:8: error: expected expression before ‘/’ token
Die erste Meldung dürfte ausreichend aussagekräftig sein, die zweite
bezieht sich auch den nicht standardkonformen Kommentar.
Wenn dein Compiler zwar die auf eine Anweisung folgende Deklaration
anmeckert, nicht aber den //-Kommentar, heißt das, dass er den neuen
(bzw. inzwischen auch schon wieder alten) C99-Standard nur teilweise
implementiert.
Arc Net schrieb:
> Bernhard N. schrieb:>> Danke! Nun ist alles klar. Aber wiedermal typisch Compiler: Behinderte>> Fehlermeldungen mit dem keiner was anfangen kann!!!>> F1 drücken und lesen... SCNR> http://msdn.microsoft.com/en-us/library/0afb82ta.aspx>>
1
> In a C program, variables must be declared at the beginning
2
> of the function, and they cannot be declared after the function
3
> executes non-declaration instructions.
4
>
5
> // C2143j.c
6
>
7
> int main()
8
> {
9
> int i = 0;
10
> i++;
11
> int j = 0; // C2143
12
> }
13
>
Mist, einmal nicht reingeschaut. ^^
Naja es liegt immer an einem selbst.. vor Allem beim Programmieren.
Frust... ;)
Gruß
Bernhard
yalu schrieb:
> Die erste Meldung dürfte ausreichend aussagekräftig sein,
Aber wahrscheinlich auch erst, seit GCC den Parser von bison auf
Handarbeit umgestellt hat. Automatisch generierte Parser sind nicht
berühmt für derart anwenderfreundliche Fehlermeldungen.
A. K. schrieb:
>> Keine vernünftiger Compiler benutzt heute einen so veralteten>> C-Standard! Und wenn er es doch tut: Ab in die Tonne mit dem Mist!>> Wahrscheinlich reicht es aus, den entsprechenden Sprachstandard> einzustellen.
Wahrscheinlich gibt es den entsprechenden Umschalter nicht (ich konnte
zumindest per Google auf die Schnelle nichts dergleichen finden). Oder
dieser Schalter fördert hunderte von Bugs in den Standard-Header-Dateien
zutage, so dass man ihn schleunigst wieder zurücknimmt (so war das bspw.
in Visual Studio 6 im C++-Modus).
Wie auch immer: Wäre ein C99-Modus vorhanden und halbwegs konsequent
implementiert, wäre das mit Sicherheit die Defaulteinstellung des
Compilers.
>> Die erste Meldung dürfte ausreichend aussagekräftig sein,>> Aber wahrscheinlich auch erst, seit GCC den Parser von bison auf> Handarbeit umgestellt hat.
Kann sein, ich weiß es nicht. Der handgeschriebene Parser ist
mittlerweile auch schon wieder viele Jahre alt.
yalu schrieb:
> Wahrscheinlich gibt es den entsprechenden Umschalter nicht
Könnte stimmen. Microsoft hat den Fokus offenbar woanders als
ausgerechnet auf sowas exotischem wie C99, was ja sowieso niemand
braucht:
http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=333273
Sei's drum, es gibt immer noch Digital Mars. Ist auch weniger agressiv
bei der Installation.
Bernhard N. schrieb:
> Ach noch was: Ich frage mich ob diese Probleme evtl.bei der> Programmierung von µC relevant sind. Ich nutze AVR Studio zusammen mit> dem AVR GCC Compiler.
Dann nimm einfach den g++. Ich sehe keinen Grund bei neuen Projekten
unbedingt gcc zu nehmen und auf die kleinen Zusatzfeatures zu
verzichten, auch wenn man unbedingt auf Klassen verzichten will.
A. K. schrieb:
> yalu schrieb:>>> Wahrscheinlich gibt es den entsprechenden Umschalter nicht>> Könnte stimmen. Microsoft hat den Fokus offenbar woanders als> ausgerechnet auf sowas exotischem wie C99, was ja sowieso niemand> braucht:> http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=333273>> Sei's drum, es gibt immer noch Digital Mars. Ist auch weniger agressiv> bei der Installation.
Digital Mars unterstützt C99 ebensowenig vollständig (nur "many C99
features") wie gcc, icc, Open Watcom oder Borland. Die einzigen
kompatiblen Compiler/Frontends dürften Comeau und clang
("feature-complete except for the C99 floating-point pragmas") sein.
Arc Net schrieb:
> features") wie gcc, icc, Open Watcom oder Borland. Die einzigen> kompatiblen Compiler/Frontends dürften Comeau und clang> ("feature-complete except for the C99 floating-point pragmas") sein.
Dann ist ja Klaus "Keine vernünftiger Compiler benutzt heute einen so
veralteten C-Standard!" zufolge nur Comeau überhaupt noch erträglich.
Microsoft unterstützt kein C99, bin ich auch schon drüber gestolpert.
Echt ärgerlich.
Und Comeau zitiert auch Fakten, die schon übergestern überholt waren.
Wobei Comeau 'wimre' auch noch nicht mal ein C-Compiler ist, sondern
C++-Quelltext in C umbaut und dann mit einem anderen Compiler übersetzt.
Wobei die GCC dem C99-Standard schon recht nahe gekommen ist, auch wenn
die GCC selbst (mitsamt der libc) ein riesen 'Clusterf*ck' ist...