2017-11-15 1 views
-4

ich einen bekommen „Fehler: initializer Element ist nicht konstant“ mit diesem Code:C initializer Element ist nicht konstant

typedef struct { 
    const int x; 
    const int y; 
} my_struct; 

const int a = 8; 
const int b = 12; 

my_struct test = { a, b }; 

Jede Idee, was los ist und wie man es beheben?

+0

Beachten Sie, dass dies kein Problem wäre, wenn Sie es stattdessen in einer Funktion (ab C99) initialisieren würden. – Groo

Antwort

-1

In C erzeugt die Verwendung eines const Modifikators keinen konstanten Wert für die Kompilierungszeit.

Dann wird, wie nach den Regeln der Initialisierung C11, Kapitel §6.7.9

All the expressions in an initializer for an object that has static or thread storage duration shall be constant expressions or string literals.

Sie einen konstanten Ausdruck werde benötigen (Zeit constat kompilieren).

Sie können stattdessen ein #define MACRO verwenden, um das gewünschte Ergebnis zu erhalten. So etwas wie (Warnung: Code nicht getestet)

#include <stdio.h> 

typedef struct { 
    const int x; 
    const int y; 
} my_struct; 

//const int a = 8; 
//const int b = 12; 

#define a 8     //use preprocessor MACROs 
#define b 12     //use preprocessor MACROs 

my_struct test = { a, b }; 

int main(void) 
{ 
    printf("Hello, world!\n"); 
    return 0; 
} 
+0

Erleuchtung, jemand? –

0

Neben macros (die haben ihre downsides), werden oft nicht namentlich Aufzählungen für den Zweck verwendet nur zur Verfügung stellen kompilieren-Zeitkonstanten. Das würde deinen Code so ändern.

typedef struct { 
    const int x; 
    const int y; 
} my_struct; 

enum { 
    a = 8, 
    b = 12, 
}; 

my_struct test = { a, b }; 

... auch Ausdrücke Kompilierung-Konstanten beteiligt sein können kompilieren Zeitkonstanten sich ...

my_struct test1 = { a+1, b }; 
my_struct test2 = { a, 'H' }; 

Auch der sizeof Betreiber produzieren kann Zeit kompilieren Konstanten:

my_struct test3 = { sizeof(my_struct), b }; 

Auch wenn dieses Beispiel nicht sehr nützlich aussieht, it compiles.

Für das Lernen, was genau konstante Ausdrücke sind, siehe zum Beispiel Constant expressions - trotz der URL (cppreference.com), ist dies der C Referenz Teil.

Verwandte Themen