Main () tarafından döndürülen değeri kim alır?


34

Bilgisayarlarda, main()işlev tarafından döndürülen değerin işletim sistemi tarafından alındığını biliyorum . Fakat main()bir mikrodenetleyici fonksiyonunda ne olur ?


7
PIC mikrodenetleyicileri için C kullanırken her zaman void main () kullanıyorum. Mikrodenetleyiciler için C derleyicileri kullanırken, bu gerçekten hiç önemli değil. Çünkü "main.c" (say) 'ı çalıştıran işletim sistemi yoktur. Bu mikrodenetleyicide çalışan RTOS gibi bir şey varsa, işletim sistemi "main.c" dir.
abdullah kahraman

4
Gerçekten bir kopya değil, ama en azından ilgili: electronics.stackexchange.com/q/30830/4950
PetPaulsen

1
Başlangıç ​​fonksiyonunun nasıl tanımlandığı genellikle karar vermek size bağlı değildir. Kullandığınız ortam, desteklenen başlangıç ​​işlevi formlarını belgeleyecektir. Barındırılan C uygulamaları main, her ikisi de geri dönen iki farklı imzalı iki formu desteklemek için gereklidir int. Bağlantısız bir C uygulaması kullanıyorsanız, bu uygulama başlatma işlevini nasıl yazmanız gerektiğini belirler. voidDönen bir işlev, yalnızca dönmediği için yazamazsınız . Dönmeme davranışı , genel çağrı kurallarını etkileyen işlev türünden farklıdır .
Kaz

Yanıtlar:


42

Bir mikrodenetleyicide, main()hiç çıkması beklenmez ve tanımlanmamışsa davranışı tanımlanmaz - bu nedenle mikrodenetleyicinin C çalışma zamanını kim yazdıysa kalmıştır. Aşağıdaki sistemleri gördüm:

  • Etrafında gizli bir döngü olsun main(), böylece çıkarsa, tekrar çağrılır.
  • Hiç çıkmazsa gerçekleştirilen basit bir "öz-zıpla" döngüsüne sahip olun main().
  • Sadece çağrıyı takip eden geri kalan kod hafızasını yürütün main(). Buna "yabani otlara kaçmak" denir.

Asla döndürülen değeri olan hiçbir şey yapan bir şey görmedim main(). Bu gerçekten önemsediğiniz bir şeyse, sisteminizin C çalışma zamanı kütüphanesinin kaynak koduna bir göz atmalı ve muhtemelen değiştirmelisiniz.


1
Beni yendin. Senkroniklik için +1.
Adam Lawrence

9
Açıkça main()bir intgeri dönüş değeri olmasını tanımlayan C standardı , işletim sistemi içermeyen bir mikrokontrolör ile akılda tutulmamıştı. Yani bu belirtilmemiş bir davranış ve C çalışma sürenize bağlı olarak Dave'in listelendiği gibi herhangi bir şey olabilir.
ndim

4
OS'siz bir mikro denetleyicide çalışan C, bağımsız bir uygulama olarak düşünülebilir ve C standardı , dönüş değerinin çok daha az tanımlanması için bağlantısız bir ortam bile gerektirmez main(). Uygulayıcıya kalmış.
KutuluMike

2
@ndim - saçları bölmek, tanımlanmayan davranış değil void main( void ), uygulama tarafından tanımlanan davranıştır .
Andrew

1
@ MichaelEdenfield: Gerçekten de. Bununla birlikte, C'deki bütün kodlar, fonksiyonlar açısından tanımlanmıştır, bu nedenle, tamamen C dilinde yazılmış bir ateşleme sistemine sahip olmak hiçbir zaman mümkün değildir ; C işlevinin çağrılabilmesi için asgari bir ortam kuran en az küçük bir montaj dili (ya da her neyse) olması gerekir. Bu fonksiyon için en belirgin isim main().
Dave Tweed

5

Yaygın bir yanlış anlama / mit, int mainstandart tarafından belirtilen tek geçerli formdur. Bu doğru değil.

C standardı iki uygulamadan bahsetmektedir: barındırılan ve bağlantısız. Bu durumda "Uygulama" derleyici anlamına gelir. Barındırılan derleyiciler belirli bir işletim sistemi için derlenir ve bağlantısız derleyiciler belirli bir metal uygulama için derlenir. Gömülü sistemler, neredeyse her zaman bağlantısız sistemlerdir - RTOS'da bile.

Bağlantısız uygulamalar için herhangi bir form kullanabilirler main(), ana olarak adlandırılan bir işleve sahip olmaları gerekmez. Çoğu zaman, formu kullanırlar void main (void), çünkü hiçbir şeyi geri getirmenin bir anlamı yoktur.

Burada fark edilmesi gereken, daima programlayıcının şeklini belirleyen ve hiçbir zaman karar verenin derleyici olduğudur main().

Solo uygulamalar yapmak dönüş şey main()çok tartışmalı bulunmaktadır. Derleyiciyi yapan kişilerin gerçekten standardı okuyup okumadıklarını merak ediyorsanız ...

Detaylar burada .


3

C dili standardı, uygulamada tanımlanan varyasyonu mümkün kılar void main( void )ve bu, gömülü sistemlerdeki olağan formdur - yalnızca geri dönmeleri beklenmez.

Derleyici kurulumuna bakarsanız, genellikle main () işlevini başlatmadan önce bazı temel başlatma işlemleri (örneğin, başlatma değerlerinin başa çıkması dahil) dahil olmak üzere, sıfırlama vektöründen çağrılan bir önyükleme kod pasajı vardır.

Bu aynı zamanda (genellikle) sonsuz bir döngü içerisinde olacaktır veya eğer main()geri dönerse , belki sıfırlama işlemini gerçekleştirecektir.


0

Bu (diğer cevaplar belirtildiği gibi) takım zincirinize bağlıdır, ancak örneğin GCC'de maindiğer fonksiyonlar olarak derlenir, bu nedenle dönüş değeri arama kurallarına göre saklanır (ARM’de GCC ile değil, kullanıyorum. dönmeden hemen önce).

Bunun AVR-GCC'de benzer olduğunu sanıyorum, bu yüzden özel betiğin bu değeri ana iadelerden sonra kullanabilir.


Bu daha ziyade özeti özlüyor
Chris Stratton

Arayan kişinin maingeri dönüş değeri alabileceğini vurguluyor . Elbette% 99,9 durumlarda göz ardı edilir, ancak cevap bu geri dönüş değerini alabilecek bilgileri sağlar.
kwesolowski
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.