gcc beschwert sich über zu kurze char arrays

#4057913
Lesenswert?

1
static const char c_a[5] = "12345";

sollte doch perfekt legaler c-Code sein. Wieso beschwert sich der gcc 
(AVR8/GNU C Compiler : 4.8.1) mit:

> error: initializer-string for array of chars is too long [-fpermissive]

Der Standard sagt explizit in 6.7.8.14:
1
An array of character type may be initialized by a character string 
2
literal, optionally enclosed in braces. 
3
Successive characters of the character string literal (including the
4
terminating null character if there is room or if the array is of
5
 unknown size) initialize the elements of the array.
#4057921
Lesenswert?

Marvin schrieb:
> Falsch. "12345" ist sechs Zeichen.

das habe ich nicht bestritten.

Du hast aber auch den von mir zitierten Abschnitt aus dem C-Standard 
nicht gelesen.
Der Besagt nämlich, dass aus dem String literal nur so viele Zeichen 
benutzt werden, wie Platz in dem Array ist.


Aber ich hab den FEhler gefunden:

mein Dateiname hat am Ende noch 2 zusätzliche 'p's :)

Und der c++ standard sieht das scheinbar anders.
Gast #4059603
Lesenswert?

Der eine sagt Programmierfehler, der andere nennt es schlechten Stil. 
Wenn jemand das betrachtet, kann er nicht erkennen was du wolltest:
- 4-Zeichen string, der falsch initialisiert wird
- 5-Zeichen string, wobei Speicher für \0 vergessen wurde

Wir können ja mal abstimmen. ;-)
#4059613
Lesenswert?

ein kommentar gehört natürlich dahinter aber
1
static const char c_sequence[] = "____--__----_-__-_,-._";

ist deutlich besser zu lesen als
1
static const char c_sequence[] = {'_','_','_','_','-','-','_','_','-','-','-','-','_','-','_','_','-','_',',','-','.','_'};

ich hätte halt nur gern das `sizeof` bzw, ARRAY_SIZE die richtige größe 
liefert;
#4059651
Lesenswert?

warning schrieb:
> Wenn jemand das betrachtet, kann er nicht erkennen was du wolltest:
> - 4-Zeichen string, der falsch initialisiert wird
> - 5-Zeichen string, wobei Speicher für \0 vergessen wurde

Für mich ist offensichtlich, daß er keins davon wollte, sondern einen 
5-Zeichen-String, der mit Absicht nicht nullterminiert sein soll. C 
lässt sowas ganz bewusst zu.
Gast #4060404
Lesenswert?

Bei der Frage Programmierfehler ja/nein, gilt als sollcher eben auch mit 
dem falschen Compiler zu übersetzen. ".cpp" ist eben nicht ".c".
GCC läßt sich aber mit -fpermissive dazu überreden, hier die C++ Syntax 
nicht allzu penibel auszulegen, denn er ahnt ja was gemeint war.
Gast #4060430
Lesenswert?

@KHB
Betrachtet man nur die code Zeile, ist nicht erkennbar, was der 
Programmierer wollte. In meinem Beispiel fehlt am Ende das d. Absicht 
oder Fehler?
Ich halte das daher für einen schlechten Stil. Nicht alles was erlaubt 
ist, ist gut und muss ausgenutzt werden. ;-)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren