Apa tujuan dari satu pon / tanda pagar (#) pada barisnya sendiri di preprosesor C / C ++?

145

Saya telah melihat kode sumber perpustakaan Boost , dan saya perhatikan bahwa sering ada tanda-tanda pound tunggal tanpa arahan preprocessor yang melekat padanya. Saya membaca manual preprocessor GCC dan panduan spesifikasi dan tidak dapat menemukan apa-apa tentang itu.

(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

Pada baris 4, tidak ada apa-apa setelah tanda pound. Apa dampaknya? Apakah ini didefinisikan dalam spesifikasi C preprocessor (CPP)?

Karena Boost adalah pustaka lintas platform, saya akan berasumsi bahwa CPP apa pun harus menguraikannya dengan benar. Apa efek / efek samping dari memiliki tanda pound / hash acak di seluruh kode?

callyalater
sumber
6
@Zaibis Eg. nama yang dapat dieksekusi dari preprocessor di suite GCC adalah "cpp" (sedangkan kompilernya adalah gcc dan g ++)
deviantfan
3
CPP adalah singkatan dari C-Plus-Plus.
djeidot
6
Tidak semuanya. Lihat kalimat pertama dari en.wikipedia.org/wiki/C_preprocessor
P45 Imminent
7
@djeidot "cpp" tidak jelas. Itulah mengapa orang menggunakan "c ++", atau "cxx" (x terlihat + berbalik 45 derajat) ketika merujuk ke C-Plus-Plus.
Mike Ounsworth
12
@djeidot Tidak, CPP adalah C-PreProcessor. Itu ada jauh sebelum C ++ bahkan ada.
Leandros

Jawaban:

185

A #sendiri pada garis tidak memiliki efek sama sekali. Saya menganggap itu digunakan untuk nilai estetika.

Standar C mengatakan:

6.10.7 Arahan kosong

Semantik

Arahan preprocessing dari formulir

# new-line

tidak berpengaruh.

Standar C ++ mengatakan hal yang sama:

16.7 Petunjuk kosong [cpp.null]

Arahan preprocessing dari formulir

# new-line

tidak berpengaruh.

Jonathan Wakely
sumber
4
Ini tidak menjelaskan tujuan menggunakannya, juga tidak memberikan alasan untuk keberadaannya.
StellarVortex
8
"Apa efeknya? Apakah ini didefinisikan dalam spesifikasi C preprocessor (CPP)? ... Apa efek / efek samping dari memiliki tanda pound / hash acak di seluruh kode?" Itu yang saya jawab. Ini tidak berpengaruh, tetapi saya tidak ingin berspekulasi tentang alasan penulis untuk menggunakannya. Saya sudah melakukannya sekarang.
Jonathan Wakely
Anda telah diberi jawaban yang benar bahwa itu tidak ada artinya bagi preprosesor; Saya akan berspekulasi bahwa itu mungkin membantu beberapa program lain (seperti IDE atau LINT) menjaga blok arahan bersama sebagai unit logis. Beberapa IDE membiarkan pemrogram memperluas atau menciutkan blok teks untuk membantu mereka melacak struktur logis file.
Spencer
107

Itu membuat kode sumber terlihat cantik, itu saja.

Menyoroti fakta bahwa seluruh blok adalah bagian preprosesor.

Dan memang, baik preprocessor C dan C ++ harus diabaikan #pada sebuah garis.

P45 Segera
sumber
16
Dan juga mempermudah navigasi dalam beberapa editor teks (mis., {Atau }dalam vim).
wchargin
@WChargin, itu tergantung pada bagaimana Anda melihatnya. Jika Anda ingin menavigasi ke antara dua blok preprosesor, menambahkan #akan mencegah Anda menggunakan {atau }. Bahkan, mungkin lebih mudah untuk menekan }dua kali untuk melompati blok (dalam contoh OP) daripada tidak dapat melompat ke tengah dua blok.
Shahbaz
3
@ Shahbaz Tentu saja! Aturan praktis saya adalah "menjaga unit logis bersama," sehingga "paragraf" benar-benar berarti "ide." Saya akan mengikuti aturan ini dengan deklarasi preprocessor juga. Tentu saja, ini adalah masalah gaya pribadi.
wchargin
46

Selalu periksa sumber yang berwenang alih-alih mengandalkan sumber daya lain. C distandarisasi sebagai ISO 9899 :: 2011, C ++ juga memiliki standar ISO. Keduanya diterima dengan baik dan draft terakhir tersedia dengan pencarian singkat. Standar C menyatakan dalam 6.10.7 (C ++ memiliki banyak teks yang sama):

Arahan preprocessing dari formulir

# new-line

tidak berpengaruh.

Ini adalah arahan nol , sebanyak ;tanpa ekspresi sebelumnya dalam bahasa inti adalah pernyataan nol .

Untuk preprocessor, ini hanya untuk pemformatan / keterbacaan untuk menyoroti bahwa garis-garis tersebut secara bersama-sama dimiliki secara semantik. (titik koma OTOH relevan secara semantik).

terlalu jujur ​​untuk situs ini
sumber