ใครได้รับค่าที่ส่งคืนโดย main ()


34

ฉันรู้ว่าในคอมพิวเตอร์ค่าที่ส่งคืนโดยmain()ฟังก์ชั่นจะได้รับจากระบบปฏิบัติการ แต่จะเกิดอะไรขึ้นในการmain()ทำงานของไมโครคอนโทรลเลอร์?


7
ฉันมักจะใช้โมฆะหลัก () เมื่อฉันใช้ C สำหรับไมโครคอนโทรลเลอร์ PIC เมื่อใช้คอมไพเลอร์ C สำหรับไมโครคอนโทรลเลอร์มันไม่สำคัญเลย เพราะไม่มีระบบปฏิบัติการที่รัน (พูด) "main.c" หากมีบางอย่างที่ RTOS ทำงานอยู่ในไมโครคอนโทรลเลอร์นั้นระบบปฏิบัติการคือ "main.c"
abdullah kahraman

4
ไม่ได้ซ้ำซ้อน แต่อย่างน้อยก็เกี่ยวข้อง: electronics.stackexchange.com/q/30830/4950
PetPaulsen

1
วิธีการกำหนดฟังก์ชั่นเริ่มต้นมักไม่ขึ้นอยู่กับคุณในการตัดสินใจ สภาพแวดล้อมที่คุณใช้จะจัดทำเอกสารในรูปแบบฟังก์ชั่นเริ่มต้นที่รองรับ เป็นเจ้าภาพการใช้งาน C จะต้องให้การสนับสนุนทั้งสองรูปแบบของการมีสองลายเซ็นที่แตกต่างกันซึ่งทั้งสองกลับมาmain intหากคุณกำลังใช้การติดตั้ง C อิสระการใช้งานนั้นจะกำหนดวิธีที่คุณควรเขียนฟังก์ชันเริ่มต้น คุณไม่สามารถเขียนvoidฟังก์ชันส่งคืนได้เพียงเพราะฟังก์ชันไม่ส่งคืน พฤติกรรมของการไม่กลับมาจะแตกต่างจากฟังก์ชั่นชนิดที่มีอิทธิพลต่อการประชุมโดยรวมเรียก
Kaz

คำตอบ:


42

บนไมโครคอนโทรลเลอร์main()ไม่ได้คาดหวังว่าจะออกจริง ๆ และพฤติกรรมหากไม่ได้กำหนดไว้ - ดังนั้นจึงขึ้นอยู่กับผู้เขียน C runtime สำหรับไมโครคอนโทรลเลอร์ ฉันเคยเห็นระบบที่:

  • มีวงรอบโดยปริยายmain()ดังนั้นถ้ามันออกไปมันก็จะถูกเรียกอีกครั้ง
  • มีการวนรอบแบบ "ข้ามไปสู่ตนเอง" อย่างง่ายซึ่งจะถูกเรียกใช้งานหากmain()ออกจากระบบ
  • main()เพียงแค่ดำเนินการส่วนที่เหลือของหน่วยความจำรหัสที่เป็นไปตามการเรียกไป สิ่งนี้เรียกว่า "วิ่งเข้าไปในวัชพืช"

main()ผมไม่เคยเห็นคนที่ไม่จริงอะไรเลยกับค่าส่งกลับโดย หากนี่คือสิ่งที่คุณสนใจจริง ๆ แล้วคุณควรดู - และอาจแก้ไข - ซอร์สโค้ดสำหรับไลบรารีรันไทม์ C ของระบบของคุณ


1
คุณเอาชนะฉันไป +1 สำหรับการซิงโครไนซ์
Adam Lawrence

9
มาตรฐาน C ที่กำหนดmain()ให้มีintค่าตอบแทนชัดเจนไม่ได้ออกแบบมาพร้อมกับไมโครคอนโทรลเลอร์ที่ใช้ระบบปฏิบัติการน้อยกว่า ดังนั้นนี่คือพฤติกรรมที่ไม่ระบุและสิ่งใด ๆ ที่อาจเกิดขึ้นขึ้นอยู่กับ C runtime ของคุณตามที่ระบุไว้ในเดฟ
ndim

4
C ที่ทำงานบนระบบปฏิบัติการไมโครคอนโทรลเลอร์น้อยอาจจะพิจารณาการดำเนินงานที่อิสระและมาตรฐานซีไม่ได้จำเป็นต้องมี environent อิสระที่จะมีmain()มากน้อยกำหนดค่าตอบแทนของ ขึ้นอยู่กับผู้ดำเนินการ
KutuluMike

2
@ndim - ขนแยกvoid main( void )เป็นการดำเนินการกำหนดพฤติกรรมไม่พฤติกรรมที่ไม่ระบุ
แอนดรู

1
@MichaelEdenfield: แน่นอน อย่างไรก็ตามรหัสทั้งหมดใน C ถูกกำหนดในรูปแบบของฟังก์ชั่นดังนั้นจึงไม่มีทางเป็นไปได้ที่ระบบ fresstanding จะเขียนเป็นภาษา C อย่างสมบูรณ์ ต้องมีอย่างน้อยภาษาแอสเซมบลีเล็กน้อย (หรืออะไรก็ตาม) ที่ตั้งค่าสภาพแวดล้อมที่น้อยที่สุดเพื่อให้สามารถเรียกใช้ฟังก์ชัน C main()ชื่อที่ชัดเจนที่สุดสำหรับการทำงานที่เป็น
Dave Tweed

5

ความเข้าใจผิด / ตำนานที่พบบ่อยคือint mainเป็นรูปแบบที่ถูกต้องเท่านั้นที่ระบุไว้ตามมาตรฐาน นั่นไม่เป็นความจริง

มาตรฐาน C พูดถึงการปรับใช้สองแบบ: โฮสต์และอิสระ "การใช้งาน" ในกรณีนี้หมายถึงคอมไพเลอร์ คอมไพเลอร์โฮสต์ที่คอมไพล์แล้วสำหรับระบบปฏิบัติการเฉพาะและคอมไพเลอร์อิสระอิสระสำหรับคอมไพล์แอปพลิเคชันโลหะเปลือย ระบบฝังตัวเป็นระบบอิสระเกือบทุกครั้ง - แม้ในกรณีของ RTOS

การใช้งานอิสระอาจใช้รูปแบบใด ๆ สำหรับmain()พวกเขาไม่จำเป็นต้องมีฟังก์ชั่นที่เรียกว่าหลัก บ่อยครั้งที่พวกเขาใช้แบบฟอร์มvoid main (void)เนื่องจากมันไม่สมเหตุสมผลที่จะคืนสิ่งใด

สิ่งสำคัญที่ต้องตระหนักคือที่นี่เป็นคอมไพเลอร์ที่ตัดสินใจรูปแบบmain()และไม่เคยเป็นโปรแกรมเมอร์

การใช้งานอิสระที่จะทำบางสิ่งบางอย่างกลับมาจากการmain()มีปัญหามาก ทำให้คุณสงสัยว่าคนที่สร้างคอมไพเลอร์อ่านมาตรฐานหรือไม่ ...

รายละเอียดที่นี่


3

มาตรฐานภาษา C อนุญาตการเปลี่ยนแปลงที่กำหนดไว้ในการนำไปปฏิบัติvoid main( void )และนี่เป็นรูปแบบปกติในระบบฝังตัว - เพียงเพราะพวกเขาไม่คาดว่าจะกลับมา

หากคุณดูที่การตั้งค่าคอมไพเลอร์มักจะมีตัวอย่างโค้ดบูตที่เรียกว่าจากเวกเตอร์รีเซ็ตซึ่งดำเนินการเริ่มต้นขั้นพื้นฐานบางอย่าง (รวมถึงการเผชิญปัญหาของค่าเริ่มต้นเป็นตัวแปร) ก่อนที่จะเรียกหลัก

สิ่งนี้จะ (โดยปกติ) อยู่ภายในวงวนไม่สิ้นสุดหรืออาจทำการรีเซ็ตหากmain()ส่งคืน


0

มัน (ตามคำตอบอื่น ๆ ที่กล่าวถึง) ขึ้นอยู่กับ toolchain ของคุณ แต่ตัวอย่างใน GCC mainนั้นถูกคอมไพล์เป็นฟังก์ชั่นอื่น ๆ ดังนั้นค่าที่ส่งคืนจะถูกเก็บไว้ตามการเรียกประชุม (บน ARM I ที่ใช้ไม่ถูกกับ GCC) ก่อนกลับมา)

ฉันเดาว่านั่นคือ simillar บน AVR-GCC ดังนั้นสคริปต์ที่กำหนดเองสามารถใช้ค่านี้ได้หลังจากส่งคืนหลัก


นี้ค่อนข้างพลาดจุด
Chris Stratton

มันเน้นว่าคนที่โทรmainสามารถได้รับผลตอบแทน แน่นอนว่ามันถูกเพิกเฉยในสถานการณ์ 99.9% แต่คำตอบให้ข้อมูลที่สามารถรับผลตอบแทนได้
kwesolowski
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.