ISO C90, C'deki karışık beyanları ve kodu yasaklar


83

Bir değişkeni şu şekilde tanımladım:

Uyarıyı alıyorum:

ISO C90, karışık beyanları ve kodu yasaklar

Nasıl düzeltebilirim?


2
GCC'ye benziyor -pedanticya da -std=c89bu durumda isterseniz derleme yapabilirsiniz -std=gnu99.
Dietrich Epp

3
Gcc kullanıyorsanız, karışık bildirimlere ve koda (bayrak -std=c99) izin veren C99 kullanmayı belirtebilirsiniz .
hmjd

11
Bir seçenek, yedeği bile değiştirilmiş olan 22 yıllık bir standarda derlemeyi durdurmak olabilir.
Stephen Canon

5
@StephenCanon, lütfen bunu Microsoft'a söyleyin. :)
hmjd

2
@hmjd: Microsoft'un bir C derleyicisini göndermeye ilgisi yoktur; bu muhtemelen değişmeyecek. Neyse ki, diğer satıcılar tarafından sağlanan platformu hedefleyen mükemmel derecede iyi birkaç derleyici var.
Stephen Canon

Yanıtlar:


127

Bence değişken bildirimini bloğun üstüne taşımalısınız. Yani

-e


5
... veya yeni bir bağlam açın:{foo(); {int i=0; bar();}}
alk

3
@alk s / context / block C Standardında buna denir.
Jens

@Johan Kotlinski Peki bu neden önemli?
ocean800

1
@ ocean800 C90 spesifikasyonu, aynı blokta bildirim dışı bildirimlerin ardından bildirim alamayacağınızı söyledi.
MM

37

C99 standardına kadar, tüm bildirimler bir bloktaki herhangi bir ifadeden önce gelmek zorundaydı:

C99, bildirimleri ve ifadeleri karıştırmaya izin verdi (C ++ gibi). Günümüzde birçok derleyici hala C89 varsayılan ve (Microsoft en gibi) bazı derleyiciler C99 desteği olmayan hiç .

Yani, aşağıdakileri yapmanız gerekecek:

  1. Derleyicinizin C99 veya sonrasını destekleyip desteklemediğini belirleyin; eğer varsa, C89 yerine C99'u derleyecek şekilde yapılandırın;

  2. Sizin derleyici sonra C99 desteklemek veya yoksa, ya gerek farklı bir derleyici bulmak için olacak gelmez bunu destekleyecek veya tüm beyanlar bloğu içinde herhangi tabloların önce gelen böylece kodunuzu yeniden.


11

Sadece bir derleyici kullanın (veya ihtiyaç duyduğu argümanları sağlayın) öyle ki C standardının daha yeni bir sürümü olan C99 veya C11 için derleyin. Örneğin, GCC derleyiciler ailesi için -std=c99.


6
Bu cevap en iyi ihtimalle eksiktir. Sorunu çözüyor ancak neyin neden olduğunu açıklamıyor. Bu yanıt, daha yeni bir derleyicinin mümkün olmadığı (birkaç olası neden ...) veya seçenekleri derleyiciye bu şekilde değiştirmenin mümkün olmadığı ortamları oluşturduğu durumları hariç tutar. Olumsuz oy, çünkü bunun "gerçek" cevap olduğuna katılamıyorum.
Andrew Falanga

1
Bazı durumlarda -std=gnu89linux çekirdek modüllerini derlerken kullanılır.
cbix

4

Değişkenin bloğun üst kısmında olduğundan emin olun ve eğer onu ile derlerseniz -ansi-pedantic, şöyle göründüğünden emin olun:


Değişkeni yine de başlatabilirsiniz, sadece onu bildirmeden önce kodu yerleştiremezsiniz.
SS Anne

2

Hatayı gerçekten neyin tetiklediğini teşhis etmek için önce kaldırmayı denerdim = 0

  • Hata tetiklenirse, büyük olasılıkla bildirim koddan sonra gelir.

  • Hata yoksa, bir C-standardı uygulama / derleme bayrakları VEYA ... başka bir şey ile ilgili olabilir.

Her durumda, değişkeni geçerli kapsamın başında tanımlayın. Daha sonra onu ayrı olarak başlatabilirsiniz. Aslında, bu değişken kendi kapsamını hak ediyorsa - tanımını {} ile sınırlandırın.

OP bağlamı açıklığa kavuşturabilirse, ardından daha yönlendirilmiş bir yanıt gelir.


1

-Wdeclaration-after-statement minimum tekrarlanabilir örnek

main.c

Uyarı verin:

Uyarı verme:

Uyarı:

Ubuntu 16.04, GCC 6.4.0'da test edilmiştir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.