2013-07-16 4 views
9

Ich googelte dafür und war überrascht, keine Richtlinien, Faustregeln, Stile usw. zu finden. Wenn man eine (vorzeichenbehaftete oder nicht-signierte) Ganzzahl in C deklariert, kann man die Wahl treffen, nur zu verwenden, was auch immer der Prozessor für int definiert oder man kann die Breite angeben (zB uint16_t, int8_t, uint32_t, usw.).Zur Größe Ihrer (u) ints oder nicht?

Wenn ich Desktop/dedizierte C-Programme mache, habe ich sehr auf die "nur die Standardwerte verwenden" geachtet, es sei denn wirklich wichtig für mich, Breite anzugeben (z. B. "dies ist eine 32-Bit-ID").

Nachdem ich in letzter Zeit mehr Mikrocontroller-Arbeit gemacht habe (Bild 18 und AVR), neige ich dazu, alles zu skalieren, nur weil man so platzbewusst wird.

Und jetzt arbeite ich an etwas Pic32-Code (kein OS), wo ich mich zwischen den beiden Extremen hin und her gerissen bin.

Ich bin gespannt, welche Rubrik (wenn überhaupt) Menschen formuliert haben, die ihnen helfen, zu entscheiden, wann sie ihre Ints und wann die Standardwerte verwenden sollen? Und warum?

+1

Wenn ich nicht-wegwerfbare Software schreibe, neige ich dazu, die 'uint_least32_t' usw. Typen zu verwenden, außer wenn ich eine bestimmte Größe benötige. Dadurch kann ich sicher sein, dass eine Mindestgröße vorhanden ist, und der Compiler kann für die nächstgrößere Größe optimiert werden. –

+3

Diese Frage ist eine Meinung einzuholen.Normalerweise reserviere ich die Größe von Integer für Datentypen, die über ein Netzwerk kommuniziert werden oder auf einer Festplatte gespeichert werden und später von einem anderen Programm gelesen werden können. – jxh

+0

@jxh Ich folge der gleichen Praxis. Wenn es sich um einen Datentyp handelt, der nur für den internen Verbrauch einer eigenständigen Instanz (d. H. Nicht verteilt) des Prozesses bestimmt ist, der den Datentyp definiert, lasse ich den Compiler seine Meinung über die "beste Größe" für den Typ wählen. Für alles, was den Prozess verlässt (entweder für die persistente Speicherung oder für die Kommunikation zwischen Prozessen), würde ich mich lieber explizit mit der Datenbemessung befassen. Möglicherweise müssen Sie sich der Endian-Probleme bewusst sein, aber zumindest ist die Datengröße vorhersehbar. –

Antwort

6

Wenn etwas für Sie wichtig ist, versuchen Sie, es so explizit wie möglich zu machen.
Wenn Sie nicht wirklich kümmern, lassen Sie den Compiler entscheiden.

Dies ist ziemlich nah an dem, was Sie selbst geschrieben haben. Wenn Sie einer Spezifikation folgen müssen, die besagt, dass etwas 32-Bit ist, verwenden Sie einen großen Typ. Wenn es nur ein Schleifenzähler ist, verwenden Sie int.

2

Es gibt tatsächlich eine Richtlinie, die dies erwähnt. MISRA C hat eine Regel, die besagt, dass Sie immer große Typen verwenden sollten. Aber die Regel ist nur beratend, nicht erforderlich oder obligatorisch für die Einhaltung.

Von here:

6,3 (adv): 'typedefs', die Größe und Signedness zeigen sollte anstelle der Grundtypen verwendet werden.

2

Sie sollten beide verwenden.

Die Misra-Regel ist gut, passt aber nicht überall.

Die Verwendung von sized-Typen eignet sich besser für die Erstellung von Kreuztabellen, z. B. für die Simulation eingebetteter Software auf einer PC-Plattform.

Aber selbst dann müssen Sie printf Größen gegen Größe Typen betrachten.

uint32_t val; 

printf("%d", val); 
printf("%ld", (long)val); 

Die ersten printf Werke auf vielen 32bit-Plattform, aber nicht auf vielen Embedded-Plattformen mit int = 16bit/lang = 32bit.

uint16_t len = strlen("text"); 

Kann Warnungen erzeugen, wie der Rückgabetyp von strlen int und int größer als uint16_t sein kann, hier ist es besser int len zu verwenden.

Verwandte Themen