เชื่อมต่อ int กับสตริงโดยใช้ C Preprocessor


91

ฉันกำลังพยายามหาวิธีเชื่อมสตริง#define'd int กับ a #define' d โดยใช้C Preprocessor คอมไพเลอร์ของฉันคือ GCC 4.1 บน CentOS 5 โซลูชันนี้ควรใช้ได้กับ MinGW ด้วย

ฉันต้องการต่อท้ายหมายเลขเวอร์ชันลงในสตริง แต่วิธีเดียวที่ฉันจะทำให้มันใช้งานได้คือการทำสำเนาหมายเลขเวอร์ชันที่กำหนดเป็นสตริง

สิ่งที่ใกล้เคียงที่สุดที่ฉันสามารถหาได้คือวิธีการอ้างอาร์กิวเมนต์มาโคร แต่ใช้ไม่ได้กับ#defines

สิ่งนี้ไม่ได้ผล

มันไม่ทำงานโดยไม่ต้อง#s ทั้งเพราะค่าจะเป็นตัวเลขและมันจะขยายตัวออกไป"/home/user/.myapp" 2 6ซึ่งไม่ถูกต้องC

วิธีนี้ใช้งานได้ แต่ฉันไม่ชอบให้สำเนาของเวอร์ชันกำหนดเพราะฉันต้องการให้เป็นตัวเลขเช่นกัน


คำตอบ:


173

คำถามพรีโปรเซสเซอร์ C คลาสสิก ....

ระดับพิเศษของการกำหนดทิศทางจะช่วยให้ตัวประมวลผลก่อนขยายมาโครก่อนที่จะแปลงเป็นสตริง


3
STR () ในกรณีนี้จะให้สตริงแบบแคบ มีรูปแบบที่จะแปลงเป็นสตริงกว้างหรือไม่?
gkns

5
ฉันไม่สามารถบอกได้ว่าฉัน googled มันกี่ครั้งและคัดลอกจากคำตอบที่แน่นอนนี้ แต่มันจะเป็นเลขสองหลัก
MightyPork

1
ต้องระบุ "STR_HELPER" ตัวแรกเนื่องจาก "#" ใช้ได้กับอาร์กิวเมนต์มาโครเท่านั้น ฉันใช้เวลา
พอสมควร

1
@clarkttfu เรียงลำดับ - ใช่#ใช้ได้กับอาร์กิวเมนต์มาโครเท่านั้น อย่างไรก็ตามSTR_HELPERแมโครเป็นสิ่งจำเป็นเพื่อหลีกเลี่ยงการเปลี่ยนแมโครMAJOR_VERเข้าสตริง"MAJOR_VAR", wheres "2"เราต้องการผลที่ได้จะเป็น
Lindydancer

13

วิธีการทำงานคือเขียน MY_FILE เป็นมาโครพาราเมตริก:

แก้ไข: ตามที่ระบุไว้โดย "Lindydancer" วิธีนี้จะไม่ขยายมาโครในอาร์กิวเมนต์ วิธีแก้ปัญหาทั่วไปคือ:


1
ตามความเห็นของฉันนี่เป็นคำตอบที่ดีที่สุดและง่ายกว่าคำแนะนำอื่น ๆ มาก ฉันประหลาดใจที่ไม่ได้รับคะแนนที่ดีขึ้น!
osirisgothra

5
เป็นวิธีที่สะอาดซึ่งน่าเสียดายที่ไม่ได้ผล ถ้าอาร์กิวเมนต์ที่ผ่านมาMY_FILEมีแมโครพูดAและแมโครนี้จะขยายตัวออกไปB "/home..." "A" "B"
Lindydancer

2

คุณสามารถทำได้ด้วยBOOST_PP_STRINGIZE :


29
ทำให้ฉันยิ้มเยาะว่าผู้คนใช้ Boost ได้อย่างไร
Frerich Raabe

4
@Frerich: การโต้แย้งของคุณให้รุนแรงผู้คนควรเขียนคอมไพเลอร์ของตนเองก่อนในโค้ดเครื่องดิบแทนที่จะโยน g ++ ไปทุกอย่าง ... ไม่มีจุดที่จะสร้างวงล้อใหม่ โปรแกรมเมอร์ที่ดีเขียนโค้ดใช้ซ้ำได้ดี
Maxim Egorushkin

@jonescb: เพียงแค่เปิดส่วนหัวของการเพิ่มและดูด้วยตัวคุณเอง
Maxim Egorushkin

11
ใช่ฉันลองแล้ว มันใช้งานได้ แต่การใช้ Boost header ในโปรแกรม C ดูเหมือนจะแปลกสำหรับฉัน
jonescb

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