คำถามติดแท็ก c-preprocessor

ตัวประมวลผลแมโครแบบข้อความที่ใช้ก่อนคอมไพล์โปรแกรมภาษา C และ C ++ แท็กนี้ยังสามารถใช้สำหรับคำถามเกี่ยวกับคอมไพเลอร์ / ภาษาอื่น ๆ ที่มาจากหรือที่มีคุณสมบัติเหมือนกันเช่น #directives ใน Objective-C หรือ C #

8
การใช้มาโครมากเกินไปในจำนวนอาร์กิวเมนต์
ฉันมีมาโครสองตัวFOO2และFOO3: #define FOO2(x,y) ... #define FOO3(x,y,z) ... ฉันต้องการกำหนดแมโครใหม่FOOดังนี้: #define FOO(x,y) FOO2(x,y) #define FOO(x,y,z) FOO3(x,y,z) แต่วิธีนี้ใช้ไม่ได้เนื่องจากมาโครไม่ทำงานเกินจำนวนอาร์กิวเมนต์ หากไม่มีการแก้ไขFOO2และFOO3มีวิธีกำหนดแมโครFOO(ใช้__VA_ARGS__หรือไม่เช่นนั้น) เพื่อให้ได้ผลการเยี่ยงเดียวFOO(x,y)กับFOO2และFOO(x,y,z)เพื่อFOO3?
183 c  macros  c-preprocessor 

30
มาโคร C ++ จะมีประโยชน์เมื่อใด [ปิด]
ปิด คำถามนี้จะต้องมีมากขึ้นมุ่งเน้น ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้มุ่งเน้นที่ปัญหาเดียวโดยแก้ไขโพสต์นี้ ปิดให้บริการใน2 ปีที่ผ่านมา ปรับปรุงคำถามนี้ C preprocessor กลัวแก้ตัวและรังเกียจโดยชุมชน c ++ ในเรียงรายฟังก์ชั่น consts #defineและแม่มักจะปลอดภัยและมีทางเลือกที่ดีกว่ากับ แมโครต่อไปนี้: #define SUCCEEDED(hr) ((HRESULT)(hr) >= 0) ไม่มีทางเหนือกว่าประเภทที่ปลอดภัย: inline bool succeeded(int hr) { return hr >= 0; } แต่มาโครมีที่อยู่โปรดระบุการใช้งานที่คุณพบสำหรับมาโครที่คุณไม่สามารถทำได้หากไม่มีตัวประมวลผลล่วงหน้า กรุณาใส่แต่ละกรณีการใช้งานในคำตอบที่แยกต่างหากเพื่อให้สามารถลงคะแนนได้และถ้าคุณรู้วิธีที่จะบรรลุหนึ่งในคำตอบโดยไม่ต้องเตรียมล่วงหน้าชี้ให้เห็นว่าในความเห็นของคำตอบนั้น

4
วิธีเลิกสมาชิกด้วยตนเอง
แตกต่างจาก Objective-C Swift ไม่มีตัวประมวลผลล่วงหน้าดังนั้นยังมีวิธีที่จะเลิกสมาชิกของคลาสด้วยตนเองหรือไม่? ฉันกำลังมองหาบางอย่างที่คล้ายกับนี้: -(id)method __deprecated;


6
__FILE__, __LINE__ และ __FUNCTION__ การใช้งานใน C ++
ทะนงว่าคุณ c ++ คอมไพเลอร์สนับสนุนพวกเขาจะมีเหตุผลใด ๆ โดยเฉพาะอย่างยิ่งไม่ได้กับการใช้งาน__FILE__, __LINE__และ__FUNCTION__สำหรับการบันทึกและวัตถุประสงค์ในการแก้จุดบกพร่อง? ฉันมักเกี่ยวข้องกับการให้ข้อมูลที่ทำให้ผู้ใช้เข้าใจผิดเช่นการรายงานหมายเลขบรรทัดหรือฟังก์ชั่นที่ไม่ถูกต้องอันเป็นผลมาจากการปรับให้เหมาะสม โดยทั่วไปฉันสามารถไว้วางใจ__FILE__, __LINE__และ__FUNCTION__จะเสมอทำสิ่งที่ถูกต้อง?

2
วิธีเชื่อมต่อสองครั้งด้วยตัวประมวลผลล่วงหน้า C และขยายแมโครดังเช่นใน“ arg ## _ ## MACRO”
ฉันพยายามเขียนโปรแกรมที่ชื่อของฟังก์ชั่นบางอย่างขึ้นอยู่กับค่าของตัวแปรมาโครที่มีมาโครเช่นนี้ #define VARIABLE 3 #define NAME(fun) fun ## _ ## VARIABLE int NAME(some_function)(int a); น่าเสียดายที่แมโครNAME()กลายเป็นสิ่งนั้น int some_function_VARIABLE(int a); ค่อนข้างมากกว่า int some_function_3(int a); ดังนั้นนี่เป็นวิธีที่ผิดอย่างชัดเจนที่จะไปเกี่ยวกับมัน โชคดีที่จำนวนของค่าที่เป็นไปได้ที่แตกต่างกันสำหรับ VARIABLE มีขนาดเล็กดังนั้นฉันจึงสามารถทำ#if VARIABLE == nและแยกรายการเคสทั้งหมด แต่ฉันสงสัยว่ามีวิธีที่ชาญฉลาดในการทำหรือไม่

10
ทางเลือกมาตรฐานของเคล็ดลับ ## __ VA_ARGS__ ของ GCC?
มีปัญหาที่รู้จักกันดี กับ args ที่ว่างเปล่าสำหรับแมโคร variadic ใน C99 ตัวอย่าง: #define FOO(...) printf(__VA_ARGS__) #define BAR(fmt, ...) printf(fmt, __VA_ARGS__) FOO("this works fine"); BAR("this breaks!"); การใช้งานBAR()ด้านบนนั้นไม่ถูกต้องตามมาตรฐาน C99 เนื่องจากจะขยายเป็น: printf("this breaks!",); สังเกตเครื่องหมายจุลภาคต่อท้าย - ใช้งานไม่ได้ คอมไพเลอร์บางตัว (เช่น: Visual Studio 2010) จะกำจัดเครื่องหมายจุลภาคที่ต่อท้ายให้คุณอย่างเงียบ ๆ คอมไพเลอร์อื่น ๆ (เช่น: GCC) รองรับการวางไว้##ด้านหน้า__VA_ARGS__เช่น: #define BAR(fmt, ...) printf(fmt, ##__VA_ARGS__) แต่มีวิธีที่เป็นไปตามมาตรฐานในการรับพฤติกรรมนี้หรือไม่? บางทีใช้มาโครหลายตัว? ตอนนี้##รุ่นดูเหมือนจะได้รับการสนับสนุนอย่างดี (อย่างน้อยบนแพลตฟอร์มของฉัน) …

3
จุดประสงค์ของเครื่องหมายปอนด์ / แฮชเดียว (#) ในบรรทัดของตนเองในตัวประมวลผลล่วงหน้า C / C ++ คืออะไร
ฉันได้ดูซอร์สโค้ดห้องสมุดBoostและฉันสังเกตว่าบ่อยครั้งที่มีสัญญาณปอนด์เดียวโดยไม่มีคำสั่ง preprocessor ติดอยู่ ฉันอ่านคู่มือตัวประมวลผลล่วงหน้าของ GCC และคู่มือข้อกำหนดและไม่พบสิ่งใดเกี่ยวกับเรื่องนี้ (1) #ifndef BOOST_CONFIG_HPP (2) # include <boost/config.hpp> (3) #endif (4) # (5) #if defined(BOOST_HAS_PRAGMA_ONCE) (6) # pragma once (7) #endif ในบรรทัด 4 ไม่มีอะไรหลังจากเครื่องหมายปอนด์ สิ่งนี้มีผลกระทบอะไรบ้าง มันกำหนดไว้ในข้อมูลจำเพาะของ C preprocessor (CPP) หรือไม่ เนื่องจาก Boost เป็นไลบรารีข้ามแพลตฟอร์มฉันจะสมมติว่า CPP ใด ๆ ควรวิเคราะห์อย่างถูกต้อง เอฟเฟกต์ / ผลข้างเคียงของการมีสัญญาณปอนด์ / แฮชแบบสุ่มตลอดรหัสคืออะไร
145 c++  c  boost  c-preprocessor 

17
“ #include” ไฟล์ข้อความในโปรแกรม C เป็นอักขระ []
มีวิธีการรวมไฟล์ข้อความทั้งหมดเป็นสตริงในโปรแกรม C ที่รวบรวมเวลาหรือไม่ สิ่งที่ต้องการ: file.txt: This is a little text file main.c: #include <stdio.h> int main(void) { #blackmagicinclude("file.txt", content) /* equiv: char[] content = "This is\na little\ntext file"; */ printf("%s", content); } การรับโปรแกรมเล็ก ๆ ที่พิมพ์บน stdout "นี่คือไฟล์ข้อความเล็ก ๆ " ตอนนี้ฉันใช้สคริปต์ python ที่แฮ็ค แต่มันน่าเกลียดและ จำกัด ชื่อตัวแปรเพียงชื่อเดียวคุณช่วยบอกวิธีอื่นให้ฉันได้ไหม

15
ฉันควรใช้ #define, enum หรือ const?
ในโปรเจ็กต์ C ++ ที่ฉันกำลังทำอยู่ฉันมีค่าแฟล็กซึ่งสามารถมีได้สี่ค่า ธงทั้งสี่นี้สามารถรวมกันได้ แฟล็กอธิบายถึงเร็กคอร์ดในฐานข้อมูลและสามารถ: สถิติใหม่ ลบบันทึก แก้ไขบันทึก บันทึกที่มีอยู่ ตอนนี้สำหรับแต่ละระเบียนฉันต้องการเก็บแอตทริบิวต์นี้ไว้ดังนั้นฉันจึงสามารถใช้ enum: enum { xNew, xDeleted, xModified, xExisting } อย่างไรก็ตามในที่อื่น ๆ ในโค้ดฉันจำเป็นต้องเลือกว่าจะให้ผู้ใช้มองเห็นเรกคอร์ดใดได้บ้างดังนั้นฉันจึงต้องการส่งผ่านข้อมูลนั้นเป็นพารามิเตอร์เดียวเช่น: showRecords(xNew | xDeleted); ดูเหมือนว่าฉันจะมี appoaches ที่เป็นไปได้สามอย่าง: #define X_NEW 0x01 #define X_DELETED 0x02 #define X_MODIFIED 0x04 #define X_EXISTING 0x08 หรือ typedef enum { xNew = 1, xDeleted, xModified = …

14
ฉันจะแสดงค่าของ #define ในเวลาคอมไพล์ได้อย่างไร
ฉันกำลังพยายามหาว่า Boost เวอร์ชันใดที่คิดว่าใช้อยู่ ฉันต้องการทำสิ่งนี้: #error BOOST_VERSION แต่พรีโปรเซสเซอร์ไม่ขยาย BOOST_VERSION ฉันรู้ว่าฉันสามารถพิมพ์ออกมาได้ในเวลาทำงานจากโปรแกรมและฉันรู้ว่าฉันสามารถดูผลลัพธ์ของตัวประมวลผลล่วงหน้าเพื่อค้นหาคำตอบได้ ฉันรู้สึกว่ามีวิธีดำเนินการนี้ในระหว่างการรวบรวมอาจเป็นประโยชน์



3
การต่อสตริงมาโคร C / C ++
#define STR1 "s" #define STR2 "1" #define STR3 STR1 ## STR2 เป็นไปได้หรือไม่ที่จะเชื่อมต่อกันโดยมี STR3 == "s1" คุณสามารถทำได้โดยส่ง args ไปยังฟังก์ชัน Macro อื่น แต่มีทางตรงไหม?
121 c++  c  c-preprocessor 

4
จะระบุแพลตฟอร์ม / คอมไพเลอร์จากมาโครตัวประมวลผลล่วงหน้าได้อย่างไร
ฉันกำลังเขียนโค้ดข้ามแพลตฟอร์มซึ่งควรรวบรวมที่ linux, windows, Mac OS บน windows ฉันต้องรองรับ visual studio และ mingw มีโค้ดเฉพาะแพลตฟอร์มบางส่วนซึ่งฉันควรวางไว้ใน#ifdef .. #endifสภาพแวดล้อม ตัวอย่างเช่นที่นี่ฉันวางรหัสเฉพาะของ win32: #ifdef WIN32 #include <windows.h> #endif แต่ฉันจะรู้จัก linux และ mac OS ได้อย่างไร ฉันควรใช้ชื่ออะไร (หรืออื่น ๆ )

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