web-dev-qa-db-ja.com

C / C ++プリプロセッサの独自の行に単一のポンド/ハッシュ記号(#)の目的は何ですか?

私は 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はそれを正しく解析するものと想定しています。コード全体でランダムなポンド/ハッシュ記号を使用すると、どのような影響/副作用がありますか?

143
callyalater

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

C規格は次のように述べています:

6.10.7 Nullディレクティブ

セマンティクス

フォームの前処理指令

# new-line

効果がありません。

C++標準は同じことを言っています:

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

フォームの前処理指令

# new-line

効果がありません。

184
Jonathan Wakely

それはソースコードをきれいに見せます、それがすべてです。

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

そして実際、CとC++の両方のプリプロセッサmust行の#を無視します。

107
P45 Imminent

他のリソースに依存するのではなく、常に信頼できるソースを確認してください。 CはISO 9899 :: 2011として標準化されていますが、C++にはISO標準もあります。両方とも受け入れられており、最終草案は短い検索で入手できます。 C標準では 6.10.7 に記載されています(C++にはほぼ同じテキストがあります):

フォームの前処理指令

# new-line

効果がありません。

これはnullディレクティブであり、コア言語の先行表現のない;null statement

プリプロセッサの場合、書式設定/読みやすさのために、行が意味的に一緒に属していることを強調します。 (セミコロンOTOHは意味的に関連しています)。