2010-12-07 8 views
5

Unter Berücksichtigung des VLA (variable Länge Array) Ich möchte Ihre Meinung zu folgendem Problem stellen: Wenn ein Array im globalen Bereich in einer Datei definiert:Wie deklariert man ein globales Array der Größe in einer anderen Datei in C99?

int arr[] = {1, 2, 3}; 

// in the same file it is no problem to obtain the number of elements in arr by 
#define arr_num sizeof(arr)/sizeof(arr[0]) 
// or 
enum {arr_num = sizeof(arr)/sizeof(arr[0])}; 

Das Problem ist, dass in anderen Dateien im selben Projekt möchte ich wieder andere Arrays im globalen Umfang mit der gleichen Anzahl von Elementen wie in arr erstellen. Aber wie kann man dies in C99 erreichen, wenn es keine Möglichkeit gibt, Enum oder # zu definieren. Natürlich kann man die Anzahl der Elemente von arr per Hand in einer Headerdatei definieren und später in den anderen Dateien verwenden, aber das ist sehr unpraktisch, da man durch Ändern der Anzahl der Elemente im Array arr auch manuell die Wert dieses #define (das ist noch unpraktischer, wenn arr ein Array von Strukturen ist).

Vielen Dank für jede Hilfe.

Antwort

0

AFAIK Sie können dies nicht gemäß C99 tun. Da alle Übersetzungsmodule unabhängig kompiliert werden, sollte sizeof zur Kompilierzeit bekannt sein.

Sie können etwas tun:

int arr[] = {1, 2, 3}; 
const int g_arrCount = sizeof(arr)/sizeof(arr[0]); 

// other translation unit 
extern const int g_arrCount; 

Wenn Sie eine ganze Programm Optimierungsoption nutzen - höchstwahrscheinlich die g_arrCount Variablen vollständig verzichtet werden und stattdessen sein direkter Wert verwendet werden.

+0

Es ist immer noch ungültig C sogar mit der ganzen Programmoptimierung. –

2

VLAs helfen nicht dabei: Sie müssen automatische Variablen sein, und daher können Sie eine globale Variable nicht zu einem VLA machen. Ich stimme mit Valdo überein, dass eine globale Variable, die die Array-Größe enthält (oder alternativ eine Funktion, die sie zurückgibt), der richtige Ansatz ist.

+0

Vielen Dank für Ihre Antworten. – davhak

+0

Von Ihnen Anregungen habe ich verstanden, dass die Hilfe der Verwendung einer globalen const-Variable oder einer Funktion davon abhängt, ob der Compiler die Optimierung des Ersetzens einer Variablen oder eines Rückgabewerts durch eine Integer-Konstante durchführen wird und solche Compiler-Flags gar nicht existieren . Würden Sie bitte auch sagen, welche Art von Compiler-Flags man verwenden könnte? (Ich arbeite mit CodeSourcery Compiler arm-none-eabi-gcc). Vielen Dank im Voraus. – davhak

+0

Eine globale 'const'-Variable ist genau das, eine * Variable *. Das ist nicht C++. 'const'-Variablen sind in konstanten Ausdrücken nicht gültig. –

Verwandte Themen