2017-06-08 1 views
2

Ich verwende Code auf einer eingebetteten Platine, die einen ARM-Prozessor verwendet. Ich habe dieses Array von Strings deklariert.Zeigerziele in der Initialisierung unterscheiden sich in signedness

const int8_t *test_str[][3] = { 
{"pa4", "3", "A0"}, 
{"pa5", "3", "A1"}, 
{"pa6", "3", "A1"},}; 

Ich teste den Code auf einem anderen ARM-Prozessor von einem anderen Hersteller und habe keine Kompilierung Warnungen. Aber wenn ich kompilieren es mit dem Board, die ich verwenden werde ich die folgende Warnung

Zeigerziele in der Initialisierung unterscheiden sich im Vorzeichen

Das Board ist ein ST32F0 ARM-Gerät. Habe ich etwas aus der Erklärung verpasst?

Dank

+0

Versuchen Sie, 'int8_t' durch' char' zu ersetzen und sehen Sie, ob Sie die gleiche Warnung erhalten. –

+2

@GovindParmar unwahrscheinlich wird er. Wahrscheinlich ist 'char' auf diesem Compiler vorzeichenlos (kann leicht durch' CHAR_MIN' herausgefunden werden). –

+0

Eigentlich mit Char entfernt die Warnung. Danke – user3047110

Antwort

2

A Stringliteral in C hat char[len] geben, wo len die Anzahl der Zeichen im wörtlichen plus eins für null Beendigung darstellt.

Da char entweder mit oder ohne Vorzeichen unterzeichnet werden kann, können Sie keinen portablen Code machen, die von Stringliterale entweder int8_t oder uint8_t ohne zusätzlichen Guss erzeugen Zeiger zwingen.

Wenn Sie const int8_t in const char ändern, werden die Zeigertypen übereinstimmen, aber der Typ der Elemente wäre nicht mehr int8_t.

+0

Es scheint, dass int8_t als signed char definiert ist. – user3047110

+1

@ user3047110 Korrekt und 'uint8_t' ist als vorzeichenlos definiert. 'char' könnte jedoch je nach System entweder signiert oder nicht signiert sein, und String-Literale sind' char'-Arrays. Daher wird das vorzeichenbehaftete/vorzeichenlose Qualifikationsmerkmal übereinstimmen. – dasblinkenlight

Verwandte Themen