Mục đích của một dấu thăng / băm đơn (#) trên dòng riêng của nó trong bộ tiền xử lý C / C ++ là gì?


145

Tôi đã xem xét mã nguồn của thư viện Boost và tôi nhận thấy rằng thường có các dấu thăng đơn mà không có bất kỳ chỉ thị tiền xử lý nào được đính kèm. Tôi đọc qua hướng dẫn đặc tả và hướng dẫn tiền xử lý GCC và không thể tìm thấy bất cứ điều gì về nó.

(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

Trên dòng 4, không có gì sau dấu thăng. Điều này có ảnh hưởng gì? Được xác định trong đặc tả tiền xử lý C (CPP)?

Vì Boost là một thư viện đa nền tảng, tôi cho rằng bất kỳ CPP nào cũng nên phân tích chính xác. Hiệu ứng / tác dụng phụ sẽ là gì khi có dấu thăng / băm ngẫu nhiên trong toàn bộ mã?


6
@Zaibis Ví dụ. tên thực thi của bộ tiền xử lý trong bộ GCC là "cpp" (trong khi trình biên dịch là gcc và g ++)
deviantfan

3
CPP là viết tắt của C-Plus-Plus.
djeidot

6
Không hoàn toàn. Xem câu đầu tiên của en.wikipedia.org/wiki/C_pre Processor
P45 sắp xảy ra vào

7
@djeidot "cpp" không rõ ràng. Đó là lý do tại sao mọi người sử dụng "c ++" hoặc "cxx" (x trông giống + quay 45 độ) khi đề cập đến C-Plus-Plus.
Mike Ounsworth

12
@djeidot Không, CPP là C-PreProcessor. Nó tồn tại cách trước khi C ++ thậm chí tồn tại.
Leandros

Câu trả lời:


185

A #trên chính nó trên một dòng không có hiệu lực nào cả. Tôi cho rằng nó đang được sử dụng cho giá trị thẩm mỹ.

Tiêu chuẩn C nói:

6.10.7 Chỉ thị Null

Ngữ nghĩa

Một chỉ thị tiền xử lý của mẫu

# new-line

không có hiệu lực.

Tiêu chuẩn C ++ nói điều tương tự:

16.7 Chỉ thị Null [cpp.null]

Một chỉ thị tiền xử lý của mẫu

# new-line

không có hiệu lực.


4
Điều này không giải thích mục đích của việc sử dụng nó, mặc dù, cũng không đưa ra lý do cho sự tồn tại của nó.
StellarVortex 9/2/2016

8
"Điều này có ảnh hưởng gì? Nó có được định nghĩa trong đặc tả bộ tiền xử lý C (CPP) không? ... Hiệu ứng / tác dụng phụ sẽ là gì khi có các dấu thăng / băm ngẫu nhiên trong toàn bộ mã?" Đó là những gì tôi trả lời. Nó không có tác dụng, nhưng tôi không muốn suy đoán về lý do tác giả sử dụng nó. Tôi đã làm như vậy bây giờ.
Jonathan Wakely 9/2/2016

Bạn đã được đưa ra câu trả lời đúng rằng nó không có nghĩa gì với bộ tiền xử lý; Tôi sẽ suy đoán rằng nó có thể giúp một số chương trình khác (như IDE hoặc LINT) giữ một khối các chỉ thị với nhau như một đơn vị logic. Một số IDE cho phép lập trình viên mở rộng hoặc thu gọn các khối văn bản để giúp họ theo dõi cấu trúc logic của tệp.
Spencer

107

Nó làm cho mã nguồn trông đẹp, chỉ vậy thôi.

Làm nổi bật thực tế là toàn bộ khối là một phần tiền xử lý.

Và thực tế, cả hai bộ tiền xử lý C và C ++ đều phải bỏ qua #trên một dòng.


16
Và cũng làm cho việc điều hướng dễ dàng hơn trong một số trình soạn thảo văn bản (ví dụ: {hoặc }trong vim).
wchargein

@WChargin, điều đó phụ thuộc vào cách bạn nhìn vào nó. Nếu bạn muốn điều hướng đến giữa hai khối tiền xử lý, việc thêm #sẽ ngăn bạn sử dụng {hoặc }. Trên thực tế, có thể nhấn }hai lần để nhảy qua khối (trong ví dụ của OP) có thể dễ dàng hơn là không thể nhảy vào giữa hai khối.
Shahbaz

3
@Shahbaz Chắc chắn! Quy tắc ngón tay cái của tôi là "giữ các đơn vị logic cùng nhau", sao cho "đoạn" thực sự có nghĩa là "ý tưởng". Tôi cũng sẽ tuân theo quy tắc này với các khai báo tiền xử lý. Tất nhiên, đó là một vấn đề của phong cách cá nhân ở một mức độ lớn.
wchargein

46

Luôn kiểm tra một nguồn có thẩm quyền thay vì dựa vào các tài nguyên khác. C được chuẩn hóa là ISO 9899 :: 2011, C ++ cũng có tiêu chuẩn ISO. Cả hai đều được chấp nhận tốt và bản nháp cuối cùng có sẵn bằng một tìm kiếm ngắn. Các trạng thái tiêu chuẩn C trong 6.10.7 (C ++ có nhiều văn bản giống nhau):

Một chỉ thị tiền xử lý của mẫu

# new-line

không có hiệu lực.

Đây là một lệnh null , nhiều như một ;biểu thức không có tiền đề trong ngôn ngữ cốt lõi là một câu lệnh null .

Đối với bộ tiền xử lý, nó chỉ dành cho định dạng / khả năng đọc để làm nổi bật rằng các dòng thuộc về ngữ nghĩa với nhau. (dấu chấm phẩy OTOH có liên quan về mặt ngữ nghĩa).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.