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?
c++
c
boost
c-preprocessor
callyalater
sumber
sumber
Jawaban:
A
#
sendiri pada garis tidak memiliki efek sama sekali. Saya menganggap itu digunakan untuk nilai estetika.Standar C mengatakan:
Standar C ++ mengatakan hal yang sama:
sumber
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.sumber
{
Atau}
dalam vim).#
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.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):
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).
sumber