C function prototype is compatible between compiler?

  • warning: realpath() [function.realpath]: SAFE MODE Restriction in effect. The script whose uid is 1005 is not allowed to access /tmp owned by uid 0 in /var/www/sites/sugree/codenone.com/subdomains/www/html/includes/file.inc on line 190.
  • warning: realpath() [function.realpath]: SAFE MODE Restriction in effect. The script whose uid is 1005 is not allowed to access /tmp owned by uid 0 in /var/www/sites/sugree/codenone.com/subdomains/www/html/includes/file.inc on line 190.

C function prototype นี่
ถ้าใช้ compiler ต่างกัน, มันจะไม่ compat กันป่าว?
เช่น compiler แต่ละตัว อาจกำหนดให้ค่าที่ return จาก function เก็บไว้ใน register ต่างกัน.
ทีนี้ caller จะรู้ได้ไงว่า obj ของ function นี้ ถูก compile ด้วย compiler ตัวไหน.
caller จะได้รู้ว่าจะดึงค่า return จาก register ไหน.
ดังนั้น มันไม่น่าจะ compat กันได้.

----
อานนท์

PaePae's picture

ค่าที่ส่งผ่านในการเรียกฟังก์ชันไม่ได้อยู่ใน register ครับ แต่จะไปอยู่บน stack แทน

แต่ก็มีความเป็นไปได้ที่จะไม่เหมือนกัน เช่น

  • วิธีการเรียงข้อมูลและใช้งาน stack ไม่เหมือนกัน อย่างใน VC++ จะมีให้ระบุนำหน้าประกาศฟังก์ชันว่า __stdcall หรือ __cdecl เป็นต้น
  • ขนาดของโครงสร้างข้อมูลไม่เท่ากันในแต่ละคอมไพเลอร์/แพลตฟอร์ม เช่น int, short, struct

เป็นหน้าที่ของโปรแกรมเมอร์ที่จะต้องเช็คให้ตรงกันนะ

ปกติ ค่า argument น่าจะมี standard ที่เรียงเหมือนกัน.
__stdcall น่าจะหมายถึงให้เรียงตาม standard.
เอ๋, แล้ว __cdecl คืออะไรเนี่ย (C declaration?).
แต่ไม่รู้ว่าค่าที่ return จาก function มันจะเก็บไว้ในไหน, ไม่รู้ว่ามันมี standard รึเปล่า.
เท่าที่ดูจาก asm ที่ gcc ทำออกมา, มันเก็บไว้ใน register EAX (32 bit), EAX+EDX (กรณี 64 bit))

กรณีนี้ พูดถึง platform เดียวกัน, เพราะ object code (*.o) ไม่น่าจะไว้สำหรับข้าม platform.

----
อานนท์

PaePae's picture

ลองดูที่นี่นะครับ

อ่อ, stdcall คือ standard ของ win32 api.
ส่วน cdecl คือ แบบที่ C/C++ ส่วนใหญ่บน x86 ใช้กัน.

ขอบคุณมากครับ.

----
อานนท์.

veer's picture

prototype คืออะไรอะครับ?

ที่อยู่ใน header, เค้าเรียกว่า function prototype.

----
อานนท์

ย้าย Codenone

ประกาศย้าย Codenone ไปใช้ Forum ของ Blognone แทนครับ ตามไปตั้งกระทู้ต่อได้ที่ Codenone Forum (รายละเอียดอ่านจากกระทู้ ย้าย Codenone ไปรวมกับ Blognone)

กระทู้เก่าๆ จะย้ายตามไปในภายหลัง ตอนนี้ปิดการโพสต์กระทู้ไว้ เหลือไว้เฉพาะอ้างอิงเท่านั้น