Saya mendapatkan kesalahan pada baris 6 (inisialisasi my_foo ke foo_init) dari program berikut dan saya tidak yakin saya mengerti mengapa.
typedef struct foo_t {
int a, b, c;
} foo_t;
const foo_t foo_init = { 1, 2, 3 };
foo_t my_foo = foo_init;
int main()
{
return 0;
}
Ingatlah ini adalah versi sederhana dari proyek multi-file yang lebih besar yang saya kerjakan. Tujuannya adalah untuk memiliki konstanta tunggal dalam file objek, yang dapat digunakan beberapa file untuk menginisialisasi struktur keadaan. Karena ini merupakan target yang disematkan dengan sumber daya terbatas dan struct tidak terlalu kecil, saya tidak ingin banyak salinan sumber. Saya lebih suka tidak menggunakan:
#define foo_init { 1, 2, 3 }
Saya juga mencoba menulis kode portabel, jadi saya butuh solusi yang valid C89 atau C99.
Apakah ini ada hubungannya dengan ORG dalam file objek? Variabel yang diinisialisasi masuk ke dalam satu ORG dan diinisialisasi dengan menyalin isi ORG kedua?
Mungkin saya hanya perlu mengubah taktik saya, dan memiliki fungsi inisialisasi melakukan semua salinan saat startup. Kecuali ada ide lain di luar sana?
sumber
enum { N = 5 };
adalah cara yang tidak dihargai untuk mendeklarasikan konstanta tanpa harus menggunakan#define
.static int* ptr = malloc(sizeof(int)*5);
tapi ini BUKAN kesalahanstatic int* ptr; ptr = malloc(sizeof(int)*5);
:: DIni adalah batasan bahasa. Di bagian 6.7.8 / 4:
Di bagian 6.6, spesifikasi mendefinisikan apa yang harus dianggap sebagai ekspresi konstan. Tidak ada tempat yang menyatakan bahwa variabel const harus dianggap sebagai ekspresi konstan. Adalah legal bagi kompiler untuk memperpanjang ini (
6.6/10 - An implementation may accept other forms of constant expressions
) tetapi itu akan membatasi portabilitas.Jika Anda dapat mengubahnya
my_foo
sehingga tidak memiliki penyimpanan statis, Anda akan baik-baik saja:sumber
static const int x = 3; static int y = x;
.Hanya untuk ilustrasi dengan membandingkan dan membandingkan Kode ini berasal dari http://www.geeksforgeeks.org/g-fact-80/ / Kode gagal dalam gcc dan lulus di g ++ /
sumber
Ini agak lama, tetapi saya mengalami masalah yang sama. Anda dapat melakukan ini jika menggunakan pointer:
sumber
gcc 7.4.0 tidak dapat mengkompilasi kode seperti di bawah ini:
constchar.c: 3: 21: error: elemen penginisialisasi tidak konstan const char * str2 = str1;
Sebenarnya, string "const char *" bukan konstanta waktu kompilasi, jadi itu tidak bisa menjadi inisialisasi. Tetapi string "const char * const" adalah konstanta waktu kompilasi, ia harus dapat menjadi inisialisasi. Saya pikir ini adalah kelemahan kecil Dentang.
Nama fungsi tentu saja merupakan konstanta waktu kompilasi. Jadi kode ini berfungsi:
sumber
str1
bukan ekspresi per 6.7.9 Inisialisasi , paragraf 4 : "Semua ekspresi dalam penginisialisasi untuk objek yang memiliki durasi penyimpanan statis atau thread harus ekspresi konstan atau string literal."