จุดประสงค์ของเครื่องหมายปอนด์ / แฮชเดียว (#) ในบรรทัดของตนเองในตัวประมวลผลล่วงหน้า C / C ++ คืออะไร


145

ฉันได้ดูซอร์สโค้ดห้องสมุด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 ใด ๆ ควรวิเคราะห์อย่างถูกต้อง เอฟเฟกต์ / ผลข้างเคียงของการมีสัญญาณปอนด์ / แฮชแบบสุ่มตลอดรหัสคืออะไร


6
@Zaibis เช่น ชื่อที่ปฏิบัติการได้ของตัวประมวลผลล่วงหน้าในชุด GCC คือ "cpp" (ในขณะที่คอมไพเลอร์คือ gcc และ g ++)
deviantfan

3
CPP ย่อมาจาก C-Plus-Plus
djeidot

6
ไม่ทั้งหมด. ดูประโยคแรกของen.wikipedia.org/wiki/C_preprocessor
P45 ใกล้เข้ามา

7
@djeidot "cpp" คลุมเครือ นั่นคือเหตุผลที่ผู้คนใช้ "c ++" หรือ "cxx" (x ดูเหมือน + เปิด 45 องศา) เมื่ออ้างถึง C-Plus-Plus
Mike Ounsworth

12
@djeidot ไม่ CPP คือ C-PreProcessor มันมีอยู่ก่อนที่ C ++ จะมีอยู่จริง
Leandros

คำตอบ:


185

#บนของตัวเองบนเส้นไม่มีผลที่ทุกคน ฉันคิดว่ามันถูกใช้เพื่อความสวยงาม

มาตรฐาน C บอกว่า:

6.10.7 Null directive

อรรถศาสตร์

คำสั่ง preprocessing ของแบบฟอร์ม

# new-line

ไม่มีผล

มาตรฐาน C ++ บอกในสิ่งเดียวกัน:

16.7 Null directive [cpp.null]

คำสั่ง preprocessing ของแบบฟอร์ม

# new-line

ไม่มีผล


4
สิ่งนี้ไม่ได้อธิบายถึงวัตถุประสงค์ของการใช้มันแม้ว่าจะไม่ให้เหตุผลสำหรับการดำรงอยู่ของมัน
StellarVortex

8
"สิ่งนี้มีผลกระทบอะไรบ้างมีการกำหนดไว้ในข้อกำหนด C preprocessor (CPP) หรือไม่ ... ผลกระทบ / ผลข้างเคียงของการมีสัญญาณปอนด์ / แฮชแบบสุ่มตลอดรหัสคืออะไร" นั่นคือสิ่งที่ฉันตอบ มันไม่มีผลกระทบ แต่ฉันไม่ต้องการคาดเดาถึงเหตุผลของผู้เขียนที่ใช้มัน ฉันทำไปแล้ว
Jonathan Wakely

คุณได้รับคำตอบที่ถูกต้องว่าไม่มีความหมายต่อผู้ประมวลผลล่วงหน้า ฉันจะคาดเดาว่ามันอาจช่วยให้โปรแกรมอื่น ๆ (เช่น IDE หรือ LINT) เก็บบล็อกของคำสั่งเข้าด้วยกันเป็นหน่วยโลจิคัล IDEs บางตัวอนุญาตให้โปรแกรมเมอร์ขยายหรือยุบบล็อกข้อความเพื่อช่วยในการติดตามโครงสร้างเชิงตรรกะของไฟล์
Spencer

107

มันทำให้ซอร์สโค้ดดูสวยนั่นคือทั้งหมด

เน้นข้อเท็จจริงที่ว่าบล็อกทั้งหมดเป็นส่วน preprocessor

และแน่นอนทั้งตัวประมวลผลล่วงหน้า C และ C ++ ต้องละเว้น#บนบรรทัด


16
และยังทำให้การนำทางง่ายขึ้นในโปรแกรมแก้ไขข้อความ (เช่น{หรือ}เป็นกลุ่ม)
wchargin

@WChargin ขึ้นอยู่กับว่าคุณจะมองอย่างไร หากคุณต้องการที่จะนำทางไประหว่างสองช่วงตึก preprocessor เพิ่ม#จะช่วยป้องกันคุณจากการใช้หรือ{ }ในความเป็นจริงการกด}สองครั้งเพื่อข้ามบล็อกนั้นอาจทำได้ง่ายกว่า (ในตัวอย่างของ OP) กว่าจะไม่สามารถข้ามไปที่กลางบล็อกทั้งสองได้
Shahbaz

3
@Shahbaz แน่นอน! กฎง่ายๆของฉันคือ "เก็บหน่วยตรรกะไว้ด้วยกัน" ดังนั้น "ย่อหน้า" จึงหมายถึง "ความคิด" จริงๆ ฉันจะปฏิบัติตามกฎนี้ด้วยการประกาศตัวประมวลผลล่วงหน้าด้วย แน่นอนว่ามันเป็นเรื่องของสไตล์ส่วนตัวในระดับสูง
wchargin

46

ตรวจสอบแหล่งข้อมูลที่เชื่อถือได้เสมอแทนที่จะใช้แหล่งข้อมูลอื่น C ได้มาตรฐานตาม ISO 9899 :: 2011, C ++ ยังมีมาตรฐาน ISO ทั้งสองได้รับการยอมรับอย่างดีและร่างสุดท้ายมีให้โดยการค้นหาสั้น ๆ สถานะมาตรฐาน C ใน6.10.7 (C ++ มีข้อความเหมือนกันมาก):

คำสั่ง preprocessing ของแบบฟอร์ม

# new-line

ไม่มีผล

นี่เป็นคำสั่งที่เป็นโมฆะเท่าที่;ไม่มีนิพจน์มาก่อนในภาษาหลักคือคำสั่งที่เป็นโมฆะคำสั่ง

สำหรับตัวประมวลผลล่วงหน้านั้นเป็นเพียงการจัดรูปแบบ / ความสามารถในการอ่านเพื่อเน้นว่าบรรทัดนั้นมีความหมายร่วมกัน (เซมิโคลอน OTOH เกี่ยวข้องกับความหมาย)

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