Bir değişkeni şu şekilde tanımladım:
int i = 0;
Uyarıyı alıyorum:
ISO C90, karışık beyanları ve kodu yasaklar
Nasıl düzeltebilirim?
Bir değişkeni şu şekilde tanımladım:
int i = 0;
Uyarıyı alıyorum:
ISO C90, karışık beyanları ve kodu yasaklar
Nasıl düzeltebilirim?
-std=c99
) izin veren C99 kullanmayı belirtebilirsiniz .
Yanıtlar:
Bence değişken bildirimini bloğun üstüne taşımalısınız. Yani
{
foo();
int i = 0;
bar();
}
-e
{
int i = 0;
foo();
bar();
}
{foo(); {int i=0; bar();}}
C99 standardına kadar, tüm bildirimler bir bloktaki herhangi bir ifadeden önce gelmek zorundaydı:
void foo()
{
int i, j;
double k;
char *c;
// code
if (c)
{
int m, n;
// more code
}
// etc.
}
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:
Derleyicinizin C99 veya sonrasını destekleyip desteklemediğini belirleyin; eğer varsa, C89 yerine C99'u derleyecek şekilde yapılandırın;
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.
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
.
-std=gnu89
linux çekirdek modüllerini derlerken kullanılır.
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.
-Wdeclaration-after-statement
minimum tekrarlanabilir örnek
main.c
#!/usr/bin/env bash
set -eux
cat << EOF > main.c
#include <stdio.h>
int main(void) {
puts("hello");
int a = 1;
printf("%d\n", a);
return 0;
}
EOF
Uyarı verin:
gcc -std=c89 -Wdeclaration-after-statement -Werror main.c
gcc -std=c99 -Wdeclaration-after-statement -Werror main.c
gcc -std=c89 -pedantic -Werror main.c
Uyarı verme:
gcc -std=c89 -pedantic -Wno-declaration-after-statement -Werror main.c
gcc -std=c89 -Wno-declaration-after-statement -Werror main.c
gcc -std=c99 -pedantic -Werror main.c
gcc -std=c89 -Wall -Wextra -Werror main.c
# https://stackoverflow.com/questions/14737104/what-is-the-default-c-mode-for-the-current-gcc-especially-on-ubuntu/53063656#53063656
gcc -pedantic -Werror main.c
Uyarı:
main.c: In function ‘main’:
main.c:5:5: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement]
int a = 1;
^~~
Ubuntu 16.04, GCC 6.4.0'da test edilmiştir.
-pedantic
ya da-std=c89
bu durumda isterseniz derleme yapabilirsiniz-std=gnu99
.