SORU
5 Ocak 2015, PAZARTESİ


‘İnt main;’ geçerli bir C/C programı?

Benim derleyici sanmıyorum olsa bile öyle düşünüyor, çünkü ben soruyorum.

echo 'int main;' | cc -x c - -Wall
echo 'int main;' | c -x c - -Wall

Çınlama sorunları bu konuda hiçbir uyarı ya da hata, ve gcc sorunları uysal uyarı: 'main' is usually a function [-Wmain] ama -std= bir Belirtme C olarak derlenmiş tek bir mesele gibi görünmüyor.

Aksi takdirde, iyi derler bağlantılar. Ama yürütme üzerine, derhal SIGBUS (benim için) ile sona erer.

What should main() return in C and C ? (mükemmel) cevaplar ve dil özellikleri ile hızlı bir grep okurken, olur elbetgibi görünüyorbana bunu bir anaişlevigereklidir. Ama gcc gelen şişirme -Wmain (‘ana’genelliklemuhtemelen aksini iddia etmek gibi bir işlevi) (ve hataları burada eksiklik).

Ama neden? Garip uç durumunda bazı veya “tarihi” bunun için kullanın. Herkes biliyor ne veriyor?

Demek istediğim, sanırım, ben gerçekten bu bir gerektiğini düşünüyorumhatabir barındırılan bir ortamda, değil mi?

CEVAP
5 Ocak 2015, PAZARTESİ


Soru C ve C olarak çift etiketli olduğundan , C ve C gerekçesi farklı olabilir:

  • C ad değiştirme linker arasında ayrım yardımcı olmak için kullanır sözel olarak farklı türleri, örneğin global bir değişken xyz özdeş semboller ve kendi başına ayakta durabilen global bir fonksiyon xyz(int). Ancak, 11* *adını hiç karıştırılmış.
  • C bir programı farklı bir sembol yerine bir çeşit sembol sağlayarak linker karıştırmayın, ve program başarılı bir şekilde bağlantı olması mümkün yani bozma, kullanmaz.

Burada neler oluyor: linker main ve Sembol bulmak için bekliyor. "Teller olursa daha iyi bilmez, çünkü bir fonksiyon olsaydı," bu bir sembol. main kontrol için geçen zamanı kitaplığı bölümünü sembol verir linker main, yani linker sorar main, bağlantıyı tamamlamak için faz izin. Tabii ki bu main bir işlevi olmadığı için, çalışma zamanında başarısız olur.

Burada, aynı konunun başka bir örnek:

x dosyası.c:

#include <stdio.h>
int foo(); // <<== main() expects this
int main(){
    printf("%p\n", (void*)&foo);
    return 0;
}

y dosyası.c:

int foo; // <<== external definition supplies a symbol of a wrong kind

derleme:

gcc x.c y.c

Bu derler ve muhtemelen aday olacağını, ancak sembolün türü derleyici sözü gerçek sembolü linker için sağlanan farklı olduğu için tanımsız davranış değil.

Bildiğim kadarıyla uyarı gidiyor, bence makul: C lets build kitaplığı hayır main fonksiyonu, derleyici boşaltır adı main diğer kullanıyorsa gerekir tanımlamak için bir değişken main nedeni bilinmeyen bir şekilde.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Neil Cicierega

    Neil Ciciere

    22 Mart 2006
  • Snazzy Labs

    Snazzy Labs

    9 Aralık 2008
  • Submissions101

    Submissions1

    23 ŞUBAT 2007