Function Prototype ขาดไปได้หรือเปล่า?

ขณะที่ผมกำลังจะอธิบายเรื่อง function prototpye ในภาษา C ในคนอื่นฟัง ก็เลยเริ่มเกริ่นก่อนว่าฟังก์ชันใดๆที่เราจะใช้เนี่ย ต้อง declare มันขึ้นมาก่อนนะ ไม่งั้นเวลาเรียก (call) โปรแกรมจะไม่รู้จัก เสร็จแล้วผมก็ลองเขียนฟังก์ชันหน้าตาประมาณนี้ให้ดู เพื่อจะแสดงให้เห็นว่ามันจะพัง

int main() {
	printf("%d\n", f());
	return 0;
}

int f() { return 20; }

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

การไม่ประกาศ function prototype ก่อนนั้นเป็นไปได้ ในกรณีที่เราไม่ได้ประกาศก่อน มันจะพยายามเดาชนิดของฟังกืชันให้เอง เช่นดู parameter ที่เราส่งเข้าไปตอน call ส่วน return type จะถือว่าเป็น integer เสมอ ดังนั้นตัวอย่างที่ผมโชว์เมื่อกี้เลยผ่านไปได้อย่างฉิวเฉียด เพราะมัน return int พอดี

ที่นี้ผมเลยเปลี่ยนตัวอย่างเป็นแบบนี้ครับ

int main() {
	printf("%f\n", f());
	return 0;
}

float f() { return 25.0; }

คราวนี้พังสมใจ เพราะครั้งแรกสุดตอนเรียก f() มันจะคิดว่าเป็น int f() แต่ตอนที่ลิงค์มาจริงๆจะหาไม่เจอเพราะเรามีแต่ float f() ให้ เรื่องราวก็มีเท่านี้ครับ XD

Taxonomy upgrade extras: