-D_XOPEN_SOURCE ทำ / หมายถึงอะไร


104

ฉันเพิ่งพบโค้ดบางอย่างที่ gcc ไม่สามารถคอมไพล์ได้หากไม่มีอาร์กิวเมนต์นี้ ฉันตรวจสอบหน้าคน gcc แล้ว แต่ไม่พบตัวเลือกเฉพาะนี้ ฉันพบXOPEN_SOURCEแต่ไม่มีคำอธิบายเล็กน้อยเกี่ยวกับสิ่งที่ทำ

ใครช่วยอธิบายให้ละเอียดหน่อยได้ไหม ฉันรู้ว่า-D_XOPEN_SOURCEสามารถตั้งค่าที่แตกต่างกันเช่น400, 600แต่สิ่งที่ทำเหล่านั้นหรือไม่

คำตอบ:


132

เมื่อคุณทำ

#define _XOPEN_SOURCE <some number>

หรือ

cc -D_XOPEN_SOURCE=<some number>

มันบอกให้คอมไพเลอร์ของคุณรวมนิยามสำหรับฟังก์ชันพิเศษบางอย่างที่กำหนดไว้ในมาตรฐาน X / Open และ POSIX

สิ่งนี้จะให้ฟังก์ชันพิเศษบางอย่างที่มีอยู่ในระบบ UNIX / BSD / Linux ล่าสุด แต่อาจไม่มีอยู่ในระบบอื่นเช่น Windows

ตัวเลขอ้างอิงถึงเวอร์ชันต่างๆของมาตรฐาน

คุณสามารถบอกได้ว่าต้องการตัวใด (ถ้ามี) โดยดูที่หน้าคนสำหรับแต่ละฟังก์ชันที่คุณเรียกใช้

ตัวอย่างเช่นman strdupพูดว่า:

   Feature Test Macro Requirements for glibc (see feature_test_macros(7)):

       strdup(): _SVID_SOURCE || _BSD_SOURCE || _XOPEN_SOURCE >= 500
       strndup(), strdupa(), strndupa(): _GNU_SOURCE

ซึ่งหมายความว่าคุณควรใส่อย่างใดอย่างหนึ่งต่อไปนี้:

#define _SVID_SOURCE
#define _BSD_SOURCE
#define _XOPEN_SOURCE 500
#define _XOPEN_SOURCE 600
#define _XOPEN_SOURCE 700

ที่ด้านบนของไฟล์ต้นฉบับของคุณก่อนที่จะทำใด ๆ#includes strdupถ้าคุณต้องการใช้งาน

หรือคุณสามารถใส่

#define _GNU_SOURCE

ที่นั่นแทนซึ่งเปิดใช้งานฟังก์ชันทั้งหมดโดยมีข้อเสียคืออาจไม่สามารถรวบรวมบน Solaris, FreeBSD, Mac OS X เป็นต้น

มันเป็นความคิดที่ดีที่จะตรวจสอบหน้าแต่ละคนก่อนที่จะทำ#include, #defineหรือใช้ฟังก์ชั่นใหม่เพราะบางครั้งพฤติกรรมของพวกเขามีการเปลี่ยนแปลงขึ้นอยู่กับตัวเลือกสิ่งที่และ#defines คุณมีตัวอย่างเช่นกับbasename (3)

ดูสิ่งนี้ด้วย:


4
เพียงแค่แสดงความคิดเห็นเพื่อขีดเส้นใต้ว่า "ที่ด้านบนของไฟล์ต้นฉบับ" มีความสำคัญเพียงใดสำหรับคำจำกัดความของภาษาถิ่นเหล่านี้ หากพวกเขาไม่ได้อยู่ในจุดสูงสุดก็จะไม่ทำงาน
Dr. Person Person II

6

-Dเป็นอ็อพชันคอมไพเลอร์ ac เพื่อกำหนดตัวแปรพรีโปรเซสเซอร์ ในกรณี_XOPEN_SOURCEนี้

สิ่งนี้ไม่ได้ส่งผลกระทบต่อพฤติกรรมของคอมไพเลอร์ แต่เป็นการเปลี่ยนแปลงวิธีการทำงานของไลบรารีบางตัวเช่นไลบรารี c มาตรฐาน มีหลายตัวเลือกเช่นนี้ ในกรณีส่วนใหญ่จะเกี่ยวข้องกับเอกสารมาตรฐานบางส่วนเกี่ยวกับอินเทอร์เฟซการเขียนโปรแกรมเฉพาะของ UNIX หรือผู้จำหน่ายห้องสมุดเฉพาะบางราย

บางครั้งการกำหนดหนึ่งในนั้นเป็นสิ่งที่จำเป็นเนื่องจากลักษณะการทำงานของฟังก์ชันมาตรฐานบางอย่างหรือแม้แต่ลายเซ็นอาจแตกต่างกันระหว่างมาตรฐาน ดังนั้นคุณอาจต้องใช้-D_XOPEN_SOURCEหรือสิ่งที่คล้ายกันเพื่อเปิดโหมดความเข้ากันได้

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


3

สิ่งนี้ทำให้ส่วนหัวเป็นของนิยามของบรรทัดฐานที่กำหนดเช่น posix บรรทัดฐานที่แท้จริงของมันถูกกำหนดโดยค่า (ที่นี่ 400 หรือ 600 เป็นต้น) ดูข้อมูลอ้างอิงนี้สำหรับการเชื่อมโยงบรรทัดฐาน / ค่า


1

ด้วยเหตุผลที่ไม่ทราบสาเหตุ Mac OS / X (XCode) ต้องการ 600 เพื่อกำหนด strdup () แม้ว่าจะอยู่ในข้อกำหนดปี 1995 ก็ตาม Mozilla และคนอื่น ๆได้พบกับสิ่งนี้ ...

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