การคอมไพล์ Cygwin gcc ล้มเหลวใน IDE ที่บ่นเกี่ยวกับ 'ทางออก' ที่ไม่ได้ประกาศ

เมื่อฉันคอมไพล์โปรแกรมโดยใช้ just

gcc code.c

ไม่มีข้อความ และสร้างไฟล์เอาต์พุตสำเร็จ ไฟล์ที่ส่งออกทำงานได้ อย่างไรก็ตาม เมื่อฉันลองใช้คอมไพเลอร์ gcc ของการติดตั้ง cygwin เดียวกันใน IDE (ฉันลองใช้ Netbeans และ Dev-C++ แล้ว) ฉันได้รับข้อผิดพลาดต่อไปนี้

main.cpp:27: error: `exit' undeclared (first use this function)
main.cpp:27: error: (Each undeclared identifier is reported only once for each function it appears in.)
main.cpp:77: error: `write' undeclared (first use this function)
main.cpp:78: error: `close' undeclared (first use this function)

ฉันไม่เห็นว่ามีอะไรแตกต่าง ทำไมมันไม่คอมไพล์ล่ะ?

โอเค ปัญหาคือใน IDE ไฟล์มีนามสกุล .cpp ในขณะที่ตอนที่ฉันคอมไพล์จากเทอร์มินัล ไฟล์นั้นมีนามสกุล .c ดังนั้น คำถามใหม่ของฉันคือเหตุใดจึงไม่คอมไพล์เมื่อถือเป็นไฟล์ c++ C ไม่ใช่เซตย่อยของ C++ ใช่หรือไม่


person Verhogen    schedule 07.02.2010    source แหล่งที่มา
comment
คุณ#include <stdlib.h>ใช่ไหม?   -  person Paul R    schedule 07.02.2010


คำตอบ (4)


C++ นั้นเข้มงวดกว่า C โดยที่ C อนุญาตให้คุณเรียกใช้ฟังก์ชันโดยไม่มีต้นแบบ แต่ C++ ไม่อนุญาตสิ่งนี้

ในการแก้ปัญหา คุณต้องการเพิ่ม:

#include <stdlib.h>

นอกจากนี้เมื่อทำการคอมไพล์ที่บรรทัดคำสั่ง ตรวจสอบให้แน่ใจว่าใช้แฟล็ก -Wall เพื่อที่คุณจะได้รับคำเตือนที่สำคัญ:

gcc -Wall code.c
person R Samuel Klatchko    schedule 08.02.2010

IDE กำลังใช้ตัวเลือกที่ยุ่งยากกว่ากับคอมไพเลอร์ คุณต้องรวมส่วนหัวบางส่วน:

#include <stdlib.h>  // exit()
#include <unistd.h>  // close(), write()

ตัวเลือกเริ่มต้นอนุญาตให้เกือบทุกอย่างที่อาจเป็น C สามารถคอมไพล์ได้ เมื่อดูจากรูปลักษณ์แล้ว IDE จะตั้งค่า '-Wmissing-prototypes' เป็นหนึ่งในตัวเลือกคอมไพเลอร์


หากคุณคอมไพล์โค้ดด้วยคอมไพเลอร์ C++ คุณต้องแน่ใจว่ามีการประกาศฟังก์ชันทั้งหมดก่อนใช้งาน C นั้นเลอะเทอะกว่า (หรืออาจจะเลอะเทอะกว่าก็ได้) เกี่ยวกับเรื่องนั้น - ขอแนะนำแนวทางปฏิบัติเพื่อให้แน่ใจว่าฟังก์ชันทั้งหมดได้รับการประกาศก่อนที่จะถูกกำหนดหรืออ้างอิง แต่ก็ไม่ได้บังคับ ใน C ++ ไม่ใช่ทางเลือก

มีเซตย่อยของ C ที่เป็นเซตย่อยของ C++ ด้วย มีบิตของ C ที่ไม่ใช่ C++ และมีบิตของ C++ หลายบิตที่ไม่ใช่ C โดยเฉพาะอย่างยิ่ง โปรแกรม C โดยทั่วไปแล้วไม่ใช่โปรแกรม C++ ตัวอย่างเช่น โปรแกรม C อาจไม่ประกาศ 'exit()' แต่สามารถใช้ได้และยังคงคอมไพล์ได้ โปรแกรม C++ ต้องประกาศ 'exit()' ก่อนจึงจะสามารถใช้งานได้และคอมไพล์

person Jonathan Leffler    schedule 08.02.2010

คุณจะต้องใช้ g++ ในการรวบรวมไฟล์ .cpp

person codaddict    schedule 07.02.2010
comment
exit(),write(),close() ทั้งหมดรองรับโดย C - person sud03r; 07.02.2010
comment
อย่างที่ฉันบอกไป มันคอมไพล์ได้ดีเมื่อฉันทำ 'gcc file.c' - person Verhogen; 08.02.2010

สาเหตุหนึ่งที่เป็นไปได้อาจเป็นเพราะ IDE ไม่สามารถเข้าถึงไฟล์รวมได้ คอมไพเลอร์ cygwin gcc อาจคาดหวังให้เป็น /usr/include (ไม่แน่ใจ) และ dev-cpp อาจไม่สามารถเข้าถึงได้

person sud03r    schedule 07.02.2010