C / C ++プリプロセッサの1行に1つのポンド/ハッシュ記号(#)を付ける目的は何ですか?


145

私はBoostライブラリのソースコードを見ていましたが、プリプロセッサディレクティブが付加されていないシングルポンド記号がよくあることに気づきました。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プリプロセッサ(CPP)仕様で定義されていますか?

Boostはクロスプラットフォームライブラリであるため、CPPで正しく解析できると思います。コード全体にランダムなポンド記号/ハッシュ記号があると、どのような影響/副作用がありますか?


6
@Zaibis例 GCCスイートのプリプロセッサーの実行可能名は「cpp」です(コンパイラーはgccおよびg ++です)
deviantfan

3
CPPはC-Plus-Plusの略です。
djeidot 2016

6
完全にではありません。en.wikipedia.org/wiki/C_preprocessor
P45緊急

7
@djeidot "cpp"があいまいです。これが、C-Plus-Plusを指すときに「c ++」または「cxx」(xは+が45度回転したように見える)を使用する理由です。
Mike Ounsworth、2016

12
@djeidotいいえ、CPPはC-PreProcessorです。C ++が存在する以前から存在していました。
Leandros、2016

回答:


185

#ライン上でのA 自体はまったく効果がありません。美的価値のために使用されていると思います。

C標準は言う:

6.10.7 nullディレクティブ

意味論

次の形式の前処理ディレクティブ

# new-line

効果はありません。

C ++標準でも同じことが言えます。

16.7 Nullディレクティブ[cpp.null]

次の形式の前処理ディレクティブ

# new-line

効果はありません。


4
しかし、これはそれを使用する目的を説明していませんし、その存在の根拠も与えていません。
StellarVortex

8
「これにはどのような影響がありますか?それはCプリプロセッサー(CPP)仕様で定義されていますか?...コード全体にランダムなポンド記号/ハッシュ記号があるとどのような影響/副作用がありますか?」それが私が答えたものです。効果はありませんが、著者の使用理由を推測したくありませんでした。私は今そうしました。
Jonathan Wakely、2016

プリプロセッサには何も意味しないという正しい答えが与えられました。他のいくつかのプログラム(IDEやLINTなど)がディレクティブのブロックを論理ユニットとしてまとめておくのに役立つ可能性があると推測します。一部のIDEでは、プログラマーがテキストのブロックを展開または縮小して、ファイルの論理構造を追跡できるようにします。
スペンサー

107

それはソースコードをきれいに見せます、それだけです。

ブロック全体がプリプロセッサセクションであることを強調します。

そして実際、CとC ++の両方のプリプロセッサ# 1行で無視する必要があります。


16
そしてまた、いくつかのテキストエディタ(例えば、中に簡単にナビゲートします{}vimの中)。
wchargin

@WChargin、それはあなたの見方次第です。あなたは2つのプリプロセッサのブロックの間に移動したい場合は、追加すると、#使用してからあなたを妨げます{}。実際、}2つのブロックの中央にジャンプできないよりも、OPの例では2回押してブロックを飛び越える方が簡単な場合があります。
Shahbaz

3
@Shahbaz確かに!私の経験則では、「論理ユニットをまとめる」ので、「段落」は本当に「アイデア」を意味します。私もプリプロセッサ宣言でこのルールに従います。もちろん、それはかなり個人的なスタイルの問題です。
wchargin 2016

46

他のリソースに依存するのではなく、常に信頼できるソースを確認してください。CはISO 9899 :: 2011として標準化されています。C++にもISO標準があります。どちらも広く受け入れられており、最終的なドラフトは短い検索で入手できます。C標準は6.10.7で述べています(C ++にはほとんど同じテキストがあります):

次の形式の前処理ディレクティブ

# new-line

効果はありません。

これは、ヌルディレクティブ限り、;コア言語で先行表現なしにはNULL文

プリプロセッサでは、行が意味的に一緒に属していることを強調するのは、フォーマット/読みやすさのためだけです。(セミコロンOTOHは意味的に関連があります)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.