2014-09-17 24 views
12

C standardı, değişken adların standart C anahtar sözcükleriyle ve standart işlev adlarıyla eşleşmemesi gerektiğini söylüyor. Öyleyse neden aşağıdaki kod hata içermiyor?Ana ve fopen geçerli değişken adları mısınız?

#include <stdio.h> 

int main() 
{ 
    int main = 10; 
    printf("Magic is %d", main); 
    return 0; 
} 

main

ayrılmış bir tanımlayıcı değildir ve
C

içinde main olarak adı değişkenleri izin yazar ouah aşağıdan bir answer ayrıca http://codepad.org/OXk4lZZE

gör

, aşağıdaki programı dikkate alarak fopen'un aynı şekilde rezerve edilmediği anlamına mı geliyor?

#include <stdio.h> 

int main() 
{ 
    int fopen = 10; 
    printf("Magic is %d", fopen); 
    return 0; 
} 
+9

C standart lotsa şeyler ... diyor kontrol giderir nasıl kontrol etmek –

+1

İlginçtir, bütün kavramı International biri Sjoerd MÜLLENDER tarafından 1984 yılında istihdam edildi "küresel bir değişken olarak ana" Obfuscated C Kodu Yarışması. Gör (burada) (http://ioccc.org/1984/mullender.c). – SevenBits

cevap

32

Program geçerli bir C programıdır.

main

ayrılmış bir tanımlayıcı değildir ve C. main olarak adı değişkenlere izin verilir

bu çelişki yaratacak diğer değişkenlerle aynıdır Ne Dosya kapsamında bir değişken main isim olduğunu yapamaz ama

aynı adı taşıyan bir işlevle:

Bu geçerli değil: aynı nedenlerden ötürü

int main = 0; 

int main(void) 
{ 
} 

bu geçerli değil:

int foo = 0; 

int foo(void) 
{ 
    return 0; 
} 

DÜZENLEME: C

(C11, 7.1.3p1) "herhangi birinde harici bağlantı ile tüm tanımlayıcılar söylediği gibi OP soru düzenlemeyi ele almak, OP, söz konusu ikinci programı da geçerlidir Aşağıdaki alt bölümlerin (gelecekteki kitaplık yönergeleri dahil) ve errno'nun her zaman dış bağlantısıyla tanımlayıcı olarak kullanılması için ayrılmıştır. "

ancak fopen değişken tanımlayıcı örnek program kapsamı ve yok bağlantı bloğuna sahiptir.

+1

Ayrıca, ' 'içerdiğinden,' fopen 'işlev stili makro olabileceğinden de haberdar olun. O zaman, taşınabilir ("kesinlikle uyumlu"), belirli bir değişken türü, özellikle de fopen (her ne olursa) gibi adlandırdığınız bir işlev işaretçisi olarak kullanılamaz, çünkü bu makroyu genişletir.Uygulamanın bir makro olarak tanımlanmamış olması veya değişken ismini bir '(' 'den önce hemen yazmazsanız, değişken bir isim olarak çalışacaktır, bu yüzden taşınabilirlik açısından oldukça iyi bir noktadır ... –

+0

Zaten verdiğiniz gerçeği, standart kütüphane fonksiyon isimleri, harici bağlantı ile kullanım için ayrılmıştır, çünkü ilgili üstbilgiyi hiçbir zaman dahil etmese bile bu bağlantı kuralı geçerlidir ve güvenilir tanımlayıcılara danışmaktan başka herhangi bir yolla güvenilir bir şekilde çalışılamaz. ve "gelecekteki yönler". –

+0

@SteveJessop Bu ilginç bir nokta, yorum için teşekkürler. OP'de 'fopen' ile 'int' örneği 'fopen' bir işlev benzeri makro olarak tanımlanabilir. Başlığın görülme sıklığı yoktur, ancak bir işlev-işaretçi türü ve işaretçiye bir çağrı ile farklı bir örnek gerçekten sorunlu olurdu. – ouah

1

Varsayılan olarak, global değişkenler ve işlevler, blok kapsamındaki auto olduğu varsayılan olarak extern şeklindedir.

bağlayıcı sembolleri here

İlgili konular