Pertanyaan Bagaimana memecahkan deklarasi statis berikut pernyataan non-statis dalam kode GCC C?


Saya mencoba untuk mengkompilasi file C yang sama pada dua mesin yang berbeda dengan versi cc yang berbeda.

gcc versi 3.2.3 mengatakan warning: 'foo' was declared implicitly 'extern' and later 'static'

gcc versi 4.1.2 mengatakan error: static declaration of 'foo' follows non-static declaration

Keduanya memiliki CFLAGS yang sama. Saya ingin membuat gcc 4.1.2 berperilaku seperti gcc 3.2.3, yaitu, menemukan opsi yang akan mengubah kesalahan ini menjadi peringatan belaka.


32
2018-06-30 10:15


asal


Jawaban:


Dari pesan kesalahan yang dikeluhkan, sepertinya Anda sebaiknya mencoba memperbaiki kode sumber. Compiler mengeluh tentang perbedaan dalam deklarasi, mirip dengan misalnya

void foo(int i);
...
void foo(double d) {
    ...
}

dan ini bukan kode C yang valid, maka kompiler mengeluh.

Mungkin masalah Anda adalah bahwa tidak ada prototipe yang tersedia ketika fungsi tersebut digunakan pertama kali dan compiler secara implisit menciptakan yang tidak akan statis. Jika demikian solusinya adalah dengan menambahkan prototipe di suatu tempat sebelum digunakan pertama kali.


26
2018-06-30 10:31



Mencoba -Wno-traditional.

Tapi lebih baik, tambahkan deklarasi untuk fungsi statis Anda:

static void foo (void);

// ... somewhere in code
    foo ();

static void foo ()
{
    // do sth
}

4
2018-06-30 10:27



Sementara gcc 3.2.3 lebih memaafkan masalah ini, gcc 4.1.2 menyoroti masalah yang berpotensi serius untuk menghubungkan program Anda nanti. Daripada kemudian mencoba untuk menekan kesalahan Anda harus membuat deklarasi maju sesuai dengan deklarasi fungsi.

Jika Anda bermaksud agar fungsi tersedia secara global (sesuai deklarasi maju) maka jangan deklarasikan sebagai statis. Demikian juga jika itu menjorok ke lokal scoped kemudian membuat pernyataan maju statis untuk dicocokkan.


4
2018-06-30 10:29



Saya memiliki masalah ini dalam kasus di mana static fungsi dipanggil sebelum dinyatakan. Memindahkan deklarasi fungsi ke mana saja di atas panggilan memecahkan masalah saya.


1
2018-05-08 09:49



Anda telah mendeklarasikan fungsi sebagai tidak statis dalam beberapa file dan Anda telah mengimplementasikan sebagai statis di file lain atau di suatu tempat, file yang sama dapat menyebabkan masalah ini juga. Misalnya kode berikut akan menghasilkan kesalahan ini.

void inlet_update_my_ratio(object_t *myobject);
//some where the implementation is like this
static void inlet_update_my_ratio(object_t *myobject) {
//code
}

Jika Anda menghapus statis dari implementasi, kesalahan akan hilang seperti di bawah ini.

 void inlet_update_my_ratio(object_t *myobject) {
    //code
    }

0
2017-12-21 16:10



Kesalahan ini dapat disebabkan oleh seperangkat kurung yang tidak tertutup.

int main {
  doSomething {}
  doSomething else {
}

Tidak begitu mudah dikenali, bahkan dalam contoh 4 baris ini.

Kesalahan ini, dalam fungsi utama 150 baris, menyebabkan kesalahan membingungkan: "pernyataan statis dari 'savepair' mengikuti pernyataan non-statis". Tidak ada yang salah dengan definisi saya tentang fungsi savePair, itu adalah bracket yang tidak tertutup.


0
2018-05-11 12:04