2017-07-15 5 views
4

Ich versuche zu verstehen, wie Struktur-Aliase in eine Binärdatei kompiliert werden, besonders wenn ein Modifikator davor steht. Ich stelle fest, dass ein Alias ​​mit und ohne * zu unterschiedlichen Binärdateien führt (die mit Shasum überprüft werden). Um zum Beispiel die folgende Struktur wiedergegeben:Verstehen, wie C-Struct-Aliase kompiliert werden

typedef struct __foobar { 
    int a; 
    int b; 
} *pfoobar_t, foobar_t; 

, wie die folgenden Variablendeklarationen unterscheidet sich von der C-Standard sind und einen Compiler Perspektive:

const pfoobar_t my_var; 
const foobar_t *my_var; 
foobar_t const *my_var; 

Vielen Dank im Voraus.

+0

Können Sie zwei vollständige Beispiele angeben, um den Unterschied darzustellen, nach dem Sie fragen? –

Antwort

3

Der Unterschied zwischen

const pfoobar_t my_var; 

und

const foobar_t *my_var; 

ist, dass der erste my_var selbst erklärt const zu sein, während der zweite my_var deklariert einen Zeiger auf ein Objekt const zu sein.

Die erste ist falsch anders als im Dateibereich, weil const Variablen initialisiert werden müssen (da sie nicht geändert werden können). Im Dateibereich wird die Variable auf NULL initialisiert; da es nicht modifiziert werden kann, kann jede Verwendung davon durch eine Konstante NULL ersetzt werden.

Im zweiten Fall kann die Variable selbst geändert werden, es spielt also keine Rolle, dass sie nicht initialisiert ist. Sobald es jedoch auf einige struct __foobar zeigt, ist eine Änderung dieses Objekts mit dem Zeiger nicht zulässig.

Die dritte Deklaration ist identisch mit der zweiten.Die erste hätte sein können

geschrieben
foobar_t *const my_var; 

By the way, Bezeichner mit zwei Unterstrichen beginnen (wie struct __foobar) zur Verwendung durch die Standardbibliothek reserviert sind (oder eine andere Implementierungsdetails) und sollte nicht in einem Programm verwendet werden .

+0

Also, wenn der erste und der dritte identisch sind, warum haben die Binaries, die produziert werden, unterschiedliche Shasums? – slagathor

+0

@slagathor. Ich sagte, dass der zweite und der dritte identisch sind. Der erste ist anders. – rici

+0

Das hast du getan. Mein Fehler. Lesen Sie zu schnell und verwechseln Sie die letzten Kommentare, die Sie hatten. – slagathor

1

Eine Struktur ist einfach ein kompakter Teil des Speichers. Beispiel: int a; int b; in einer 32-Bit-Architektur, ergibt eine 8-Byte-Struktur (2 x 4 Byte).

Nicht ausgerichtete Strukturen (z. B. 9 Byte) sind möglich, obwohl bei Zuweisung (z. B. auf dem Stack) der zugewiesene Speicherbereich ausgerichtet wird (12 Byte,).

können Sie sehen, dass der Compiler anders reagiert, und dass diese Aufgaben insbesondere durch die Verwendung der const Richtlinie unterscheiden:

die folgende Struktur gegeben:

typedef struct __foobar { 
    int a; 
    int b; 
} *pfoobar_t, foobar_t; 

Sie versuchen:

#include <stdio.h> 

int main(){ 
    foobar_t var; 
    const pfoobar_t my_var = &var; 
    my_var->a = 3; 
    printf("%d\n", my_var->a); 
} 

Es kompiliert und läuft ohne Problem. Nun ändern Sie den Code für:

#include <stdio.h> 

int main(){ 
    foobar_t var; 
    const foobar_t *my_var; 
    my_var->a = 3; 
    printf("%d\n", my_var->a); 
} 

Es wird nicht kompilieren:

const.c: In function ‘main’: 
const.c:13:3: error: assignment of member ‘a’ in read-only object 
    my_var->a = 3; 

Statische Objekte werden in einem speziellen Teil eines binären gespeichert und somit Ihre verschiedenen Erklärungen, die Form des ELF-Format ändern.

Verwandte Themen