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

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

28
อะไรคือความแตกต่างระหว่าง #include <filename> และ #include“ filename”
ในภาษาการเขียนโปรแกรม C และ C ++ ความแตกต่างระหว่างการใช้วงเล็บมุมและการใช้อัญประกาศในincludeคำสั่งมีดังนี้ #include &lt;filename&gt; #include "filename"

5
ทำไมตัวประมวลผลล่วงหน้า C ตีความคำว่า“ linux” เป็นค่าคงที่“ 1”
ทำไมCตัวประมวลผลล่วงหน้าในGCCตีความคำว่าlinux(ตัวอักษรตัวเล็ก) เป็นค่าคงที่1? test.c: #include &lt;stdio.h&gt; int main(void) { int linux = 5; return 0; } ผลลัพธ์ของ $ gcc -E test.c (หยุดหลังจากขั้นตอนการประมวลผลล่วงหน้า): .... int main(void) { int 1 = 5; return 0; } ซึ่งแน่นอนว่าข้อผิดพลาด (BTW: ไม่มี#define linuxในstdio.hไฟล์)
1022 c  linux  gcc  c-preprocessor 

9
ทำไมจึงใช้คำสั่ง do-while และ if-else ที่ไม่มีความหมายในแมโคร
ในมาโคร C / C ++ หลายรุ่นฉันเห็นโค้ดของมาโครห่อหุ้มสิ่งที่ดูเหมือนเป็นdo whileลูปที่ไม่มีความหมาย นี่คือตัวอย่าง #define FOO(X) do { f(X); g(X); } while (0) #define FOO(X) if (1) { f(X); g(X); } else ฉันไม่เห็นว่าdo whileกำลังทำอะไรอยู่ ทำไมไม่ลองเขียนโดยไม่ได้ล่ะ #define FOO(X) f(X); g(X)
787 c++  c  c-preprocessor  c++-faq 


3
เหตุใดไฟล์ C ทั้งหมดที่เขียนโดยอาจารย์ของฉันเริ่มต้นด้วย # ในบรรทัดแรก
ฉันกำลังจะผ่านบันทึกย่อของหลักสูตร C และทุกไฟล์ต้นฉบับของโปรแกรม C เริ่มต้นด้วย#บรรทัดเดียวในบรรทัดแรกของโปรแกรม จากนั้นมีบรรทัดว่างและติดตามสิ่งอื่นตามด้วยmainฟังก์ชัน เหตุผลสำหรับการ#คืออะไร? (ตอนนี้หมดระยะเวลาแล้วและฉันก็ไม่สามารถถามได้เลย) นี่คือตัวอย่าง: # #include &lt;stdio.h&gt; int main() { printf("Hello, World!"); return 0; }
431 c  c-preprocessor 

4
การรวม C ++ และ C - #ifdef __cplusplus ทำงานอย่างไร
ฉันกำลังทำงานในโครงการที่มีรหัสCดั้งเดิมมากมาย เราได้เริ่มเขียนใน C ++ โดยมีเจตนาที่จะแปลงรหัสดั้งเดิมในที่สุดเช่นกัน ฉันสับสนเล็กน้อยเกี่ยวกับการโต้ตอบของCและ C ++ ฉันเข้าใจว่าการห่อรหัสCด้วยextern "C"คอมไพเลอร์ C ++ จะไม่ทำให้ชื่อของรหัสCเสื่อมลงแต่ฉันไม่แน่ใจว่าจะใช้สิ่งนี้ได้อย่างไร ดังนั้นที่ด้านบนของไฟล์ส่วนหัวCแต่ละไฟล์ (หลังจากที่มียามรวม) เรามี #ifdef __cplusplus extern "C" { #endif และที่ด้านล่างเราเขียน #ifdef __cplusplus } #endif ในระหว่างสองเรามีทั้งหมดของเรารวมถึง typedefs และฟังก์ชั่นต้นแบบ ฉันมีคำถามสองสามข้อเพื่อดูว่าฉันเข้าใจสิ่งนี้ถูกต้องหรือไม่: ถ้าฉันมีไฟล์ C ++ A.hh ซึ่งรวมถึงไฟล์ส่วนหัวC Bh รวมถึงไฟล์ส่วนหัวCอีกCh วิธีนี้ทำงานอย่างไร ฉันคิดว่าเมื่อคอมไพเลอร์เข้าสู่ Bh __cplusplusจะถูกกำหนดดังนั้นมันจะล้อมโค้ดด้วยextern "C" (และ__cplusplusจะไม่ถูกกำหนดภายในบล็อกนี้) ดังนั้นเมื่อเข้าสู่ Ch แล้ว __cplusplusจะไม่ถูกกำหนดและรหัสจะไม่ถูกรวมเข้าด้วย extern "C"กัน …

14
ต่ำสุดและสูงสุดเป็น c
อยู่ที่ไหนMINและMAXกำหนดไว้ใน C ถ้าทั้งหมด? เป็นวิธีที่ดีที่สุดในการใช้สิ่งเหล่านี้โดยทั่วไปและพิมพ์อย่างปลอดภัยที่สุดเท่าที่จะทำได้? (ส่วนขยายคอมไพเลอร์ / บิวอินสำหรับคอมไพเลอร์หลักที่ต้องการ)
299 c  max  min  c-preprocessor 


6
ตัวประมวลผลก่อนดัมพ์ GCC กำหนด
Наэтотвопросестьответына กองมากเกินнарусском : Какузнатьсписоквсехопределённыхмакросов? มีวิธีสำหรับ gcc / g ++ เพื่อถ่ายโอนข้อมูลตัวประมวลผลล่วงหน้าที่กำหนดจากบรรทัดคำสั่งหรือไม่? ผมหมายถึงสิ่งที่ชอบ__GNUC__, __STDC__และอื่น ๆ
248 gcc  g++  c-preprocessor 

11
#pragma pack effect
ฉันสงสัยว่ามีใครบางคนสามารถอธิบายให้ฉันฟังได้ว่า#pragma packคำสั่ง preprocessor ทำอะไรและที่สำคัญกว่านั้นคือเหตุใดจึงต้องการใช้มัน ฉันเช็คเอาท์หน้า MSDNซึ่งให้ข้อมูลเชิงลึก แต่ฉันหวังว่าจะได้รับความรู้เพิ่มเติมจากผู้ที่มีประสบการณ์ ฉันเคยเห็นมันในรหัสก่อนหน้า แต่ฉันไม่สามารถหาได้อีกต่อไป

12
#define macro สำหรับการดีบักการพิมพ์ใน C?
กำลังพยายามสร้างแมโครซึ่งสามารถใช้สำหรับข้อความดีบักการพิมพ์เมื่อกำหนด DEBUG เช่นรหัสเทียมต่อไปนี้: #define DEBUG 1 #define debug_print(args ...) if (DEBUG) fprintf(stderr, args) การทำมาโครนี้ทำได้อย่างไร
209 c  c-preprocessor 

10
ฉันจะดูไฟล์ต้นฉบับ C / C ++ ได้อย่างไรหลังจากประมวลผลล่วงหน้าใน Visual Studio
สมมติว่าฉันมีไฟล์ต้นฉบับที่มีคำสั่ง preprocessor มากมาย เป็นไปได้หรือไม่ที่จะดูว่ามันดูแลตัวประมวลผลล่วงหน้าด้วยหรือไม่

5
วิธีสร้างมาโครแบบผันแปร (จำนวนอาร์กิวเมนต์ที่ผันแปร)
ฉันต้องการเขียนแมโครใน C ที่ยอมรับพารามิเตอร์จำนวนเท่าใดก็ได้ไม่ใช่ตัวเลขที่เฉพาะเจาะจง ตัวอย่าง: #define macro( X ) something_complicated( whatever( X ) ) โดยที่Xจำนวนพารามิเตอร์ใด ๆ ฉันต้องการสิ่งนี้เพราะwhateverโอเวอร์โหลดและสามารถเรียกได้ด้วยพารามิเตอร์ 2 หรือ 4 ฉันพยายามกำหนดมาโครสองครั้ง แต่คำจำกัดความที่สองเขียนทับอันแรก! คอมไพเลอร์ที่ฉันทำงานด้วยคือ g ++ (โดยเฉพาะเจาะจงมากขึ้น mingw)

16
ฉันจะตรวจสอบระบบปฏิบัติการด้วยคำสั่งพรีโปรเซสเซอร์ได้อย่างไร
ฉันต้องการรหัสของฉันเพื่อทำสิ่งต่าง ๆ ตามระบบปฏิบัติการที่ได้รับการรวบรวม ฉันกำลังมองหาบางสิ่งเช่นนี้: #ifdef OSisWindows // do Windows-specific stuff #else // do Unix-specific stuff #endif มีวิธีทำเช่นนี้หรือไม่? มีวิธีที่ดีกว่าในการทำสิ่งเดียวกันหรือไม่?

11
คำเตือนคอมไพเลอร์“ ไม่มีบรรทัดใหม่ที่ท้ายไฟล์”
อะไรคือสาเหตุของคำเตือนต่อไปนี้ในคอมไพเลอร์ C ++ บางตัว? ไม่มีการขึ้นบรรทัดใหม่ท้ายไฟล์ เหตุใดฉันจึงควรมีบรรทัดว่างท้ายไฟล์ต้นทาง / ส่วนหัว

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