Forum: Mikrocontroller und Digitale Elektronik Ort der Variablendeklaration: Welcher Standard


von Hmmm? (Gast)


Lesenswert?

Ich kann in meiner SiliconLabs IDE (KEIL Compiler) in einer For-Schleife 
keine Laufvariable definieren, ich muss diese stets am Anfang der 
Funktion erstellen,. Generell muss ich alle variablen am Anfang einer 
Funktion rstellen.

Funktioniert:
1
void test(){
2
  int i;
3
  for(i = 0; i < 10; i++){
4
  }
5
}


Funktioniert nicht:
1
void test(){
2
  for(int i = 0; i < 10; i++){
3
  }
4
}

Schlampen hier STM32Workbench, AVR Studio rum oder ist das einfach ein 
alter Standard?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Klingt nach ANSI C89 / ISO C90.

Seit ISO C99 kann man die Variable in der for-Anweisung definieren.

Dieser Standard ist aber noch keine 20 Jahre abgehangen. ;-)

ps: Eine legacy-Funktionsdeklaration (leere Argumentliste) ist in C99
jedoch "deprecated".

von Danish (Gast)


Lesenswert?

Jörg W. schrieb:
> ps: Eine legacy-Funktionsdeklaration (leere Argumentliste) ist in C99
> jedoch "deprecated".

Muss man dann zB
1
void x(void) anstelle von
2
void x()

schreiben?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Yep.

In C++ ist beides dasselbe (da es dort die "legacy"-Version nie gab),
in C ist das eine "eine Funktion ohne Parameter", das andere "eine
Funktion mit einer unbestimmten Anzahl von Parametern".

von Dr. Sommer (Gast)


Lesenswert?

Kannst du da nicht einstellen, dass es C99 verwenden soll? Es wäre ja 
eine recht unnötige Quälerei, sich mit so einem alten Standard 
rumschlagen zu müssen. Beim GCC z.B. kann man über -std=c99 o.ä. den 
gewünschten Standard auswählen.

von Scott Meyers (Gast)


Lesenswert?

Dr. Sommer schrieb:
> Kannst du da nicht einstellen, dass es C99 verwenden soll? Es wäre
> ja
> eine recht unnötige Quälerei, sich mit so einem alten Standard
> rumschlagen zu müssen. Beim GCC z.B. kann man über -std=c99 o.ä. den
> gewünschten Standard auswählen.

Besser noch -std=c11.

von Scott Meyers (Gast)


Lesenswert?

Scott Meyers schrieb:
> Dr. Sommer schrieb:
>> Kannst du da nicht einstellen, dass es C99 verwenden soll? Es wäre
>> ja
>> eine recht unnötige Quälerei, sich mit so einem alten Standard
>> rumschlagen zu müssen. Beim GCC z.B. kann man über -std=c99 o.ä. den
>> gewünschten Standard auswählen.
>
> Besser noch -std=c11.

Und der C++-Programmierer freut über if/switch mit Initialisierern:
1
if (int x = foo(); x < value) {
2
    bar(2 * x);
3
}
4
else {
5
    bar(x)
6
}

von Jan (Gast)


Lesenswert?

Es gibt bei Keil in den Compiler Einstellungen einen Haken für c99

von A. S. (Gast)


Lesenswert?

Scott Meyers schrieb:
> if (int x = foo(); x < value) {
>     bar(2 * x);
> }
> else {
>     bar(x)
> }

geht das nicht mit ',' statt ';' in C enenso?

von Scott Meyers (Gast)


Lesenswert?

Achim S. schrieb:
> Scott Meyers schrieb:
>> if (int x = foo(); x < value) {
>>     bar(2 * x);
>> }
>> else {
>>     bar(x)
>> }
>
> geht das nicht mit ',' statt ';' in C enenso?

Natürlich kann man bei C im Bedingungsteil des if den Komma-Operator 
verwenden, aber dann müssen dort Ausdrücke stehen, und eine Deklaration 
ist kein Ausdruck ... Am besten nochmal nachschauen, was der 
Komma-Operator ist!

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.