2010-01-31 22 views
11

Visual Studio 2010'da C yazıyorum. Derleyici satır içi değişken bildirimleri kullanmama izin vermek istemiyor. Aşağıdaki kod bir hata üretir:Microsoft C Derleyici: Satır içi değişken bildirimi?

unsigned int fibonacci_iterative(unsigned int n) { 
if (n == 0) { 
    return 0; 
} 
if (n == 1) { 
    return 1; 
} 

unsigned int prev_prev = 0; // error 
unsigned int prev = 1; // error 
unsigned int next = 0; // error 
for (int term_number = 0; term_number < n; term_number++) { 
    unsigned int temp = prev_prev + prev; 
    prev = next; 
    prev_prev = prev; 
    next = temp; 
} 

return next; 
} 

Hata:

error C2143: syntax error : missing ';' before 'type'

error C2143: syntax error : missing ';' before 'type'

error C2143: syntax error : missing ';' before 'type'

neden oluyor? Derleyiciyi bu kadar katı yapmamak için bir ayar var mı?

cevap

10

Bildirimlerden sonra C89'da izin verilmesine izin verilmez, ancak C++ ve C99'da olmasına rağmen (MSVC hala C99'u desteklemez).

C89, bir iç içe blok kullanarak benzer bir etkiyi elde edebilirsiniz:

unsigned int fibonacci_iterative(unsigned int n) { 
    if (...) { 
    } 

    { 
     unsigned int prev_prev = 0; 
     unsigned int prev = 1; 
     unsigned int next = 0; 
     ... 
    } 
} 
+2

Biraz dağınık, değil mi? Bu değişkenlere referans veren tüm işlevin geri kalanı, bloğun içinde olmalıdır, böylece değişkenler kapsam dışında kalmaz. Aşırı kullanılırsa, bu _very_ dağınık ve brace-ağır koduna yol açacaktır. –

+0

@Chinmay: Bu bağlıdır. Evet, büyük bloklar için dağınıklığa son verebilir, ancak bazı değişkenlerin sadece çok sınırlı bir kapsam gerektirdiği küçük bloklar için de yararlı olabilir. – jamesdlin

+0

Bu ne kadar taşınabilir? Bu sorun için soruyormuş gibi görünüyor. –

1

C++ olarak derlemeye çalışın. C99, değişkenlerin kapsamın dışında bir şekilde bildirilmesine izin verir, ancak VC, C99'u bilmez.

+0

Chinmay bahseder gibi, C ve C++ kaynak düzeyinde tam uyumlu değildir. http://en.wikipedia.org/wiki/Compatibility_of_C_and_C++ – ephemient

1

Satır içi değişken bildirimleri yalnızca C99 uyumlu bir derleyicide desteklenir. Microsoft Visual C++ C99 uyumlu değil (ref) görünmüyor. Ya bir C99 uyumlu derleyiciyi kullanmanız gerekecek (GCC, -std=c99 ile kullanıldığında satır içi değişkenlerle kod derleyecektir) veya değişkenlerinizi işlevin üst kısmında bildirecektir.

DÜZENLEME: Veya C++ modu, akallio tarafından önerildiği gibi deneyin, ancak C ve C++ birbiriyle kesinlikle uyumlu olmasa da, (örneğin), C kodunuzda C++ - özel anahtar sözcükler kullanırsanız Derleme

+1

Anahtar kelime bir yana, işaretçi dökümü ve 'enum/struct/union 'ad alanlarına ilişkin farklı kurallar da C++ modunda derlenemeyen güvenli C kodu oluşturabilir. C 'de' sizeof ('a') == sizeof (int) ', fakat C++' da 'sizeof (' a ') == sizeof (char)' gibi başka diziler vardır, fakat pratikte bu problemlerin ortak bir nedeni değildir. – ephemient

İlgili konular