ความต้องการที่แตกต่างกันเล็กน้อย: ฉันจำเป็นต้องมีการทดสอบเช่นนี้ในสคริปต์โปรแกรมสร้างการกำหนดค่าเพื่อตรวจสอบว่าเครื่องเป้าหมายรวบรวมเป็นบิตหรือ endian เล็ก ๆ น้อย ๆโดยไม่ต้องดำเนินการรหัส สคริปต์ที่ต้องฝาก#define HAVE_LITTLE_ENDIAN 1
เป็นส่วนหัวหรืออื่น ๆconfig.h
#define HAVE_LITTLE_ENDIAN 0
เครื่องเป้าหมายการคอมไพล์อาจแตกต่างจากเครื่องบิลด์เนื่องจากเราอาจทำการคอมไพล์ข้ามซึ่งยังอธิบายว่าทำไมการทดสอบจะต้องไม่พยายามรันโค้ดที่คอมไพล์ มันเป็นไปไม่ได้เลยที่จะมีโปรแกรม C นิดหน่อยพร้อมprintf
คำสั่งที่คายคำตอบ
ทางออกที่เป็นไปได้คือสิ่งนี้ เราสร้างไฟล์ชื่อconftest.c
ที่มี:
#define USPELL(C0, C1, C2, C3) \
((unsigned) C0 << 24 | \
(unsigned) C1 << 16 | \
(unsigned) C2 << 8 | (unsigned) C3)
unsigned x[6] = {
0,
USPELL('L', 'I', 'S', 'P'),
USPELL('U', 'N', 'I', 'X'),
USPELL('C', 'O', 'R', 'E'),
USPELL('D', 'W', 'I', 'M'),
0
};
ตอนนี้เรารวบรวมสิ่งนี้เพื่อconftest.o
ใช้:
$ /path/to/cross-compiling/cc conftest.c -c
จากนั้นเราก็เรียกใช้:
$ strings conftest.o
PSILXINUEROCMIWD
หากสตริงPSILXINUEROCMIWD
เกิดขึ้นเป้าหมายจะเป็นแบบเอนด์ หากสตริงLISPUNIXCOREDWIM
เกิดขึ้นแสดงว่าเป็น big-endian หากไม่มีสตริงเกิดขึ้นหรือน่าประหลาดใจมากกว่ากันทั้งคู่ก็แสดงว่าการทดสอบล้มเหลว
วิธีการนี้ใช้งานได้เพราะค่าคงที่ "fourcc" ที่คำนวณในโปรแกรมมีค่าที่ไม่ขึ้นอยู่กับเครื่อง เป็นตัวแทนของพวกเขาเก็บไว้ในแฟ้มวัตถุดังนี้ endianness strings
ของระบบเป้าหมายและที่สามารถมองเห็นได้ผ่านทางมุมมองของตัวอักษรตามภายใต้
คำปกป้องสองคำที่เป็นศูนย์ตรวจสอบให้แน่ใจว่าแยกสตริง นั่นไม่จำเป็นอย่างเคร่งครัด แต่มันทำให้มั่นใจได้ว่าสตริงที่เรากำลังค้นหาไม่ได้ถูกฝังอยู่ในสตริงอื่น ๆ ซึ่งหมายถึงว่าstrings
มันจะแสดงผลบนบรรทัดด้วยตัวมันเอง
ป.ล. USPELL
แมโครจะไม่วงเล็บการแทรกอาร์กิวเมนต์เนื่องจากสร้างขึ้นเพื่อวัตถุประสงค์เฉพาะนี้ไม่ใช่เพื่อการใช้ซ้ำ