7

そこで、C99 標準の n869 ドラフトをざっと調べてみると、次のセクションに出くわしました。

6.10.7 Null ディレクティブのセマンティクス

フォームの前処理ディレクティブ

# new-line

効果はありません。

だから、私はそれをテストするためにこのプログラムを書きました:

#
#include <stdio.h>
#

int main(void)
{
  puts("Hello, world!");

  return 0;
}

案の定、gcc警告などをずっと上げていたとしても、このコードには問題がありませんでした。初期化子で許可されている余分なコンマ、列挙型定義など、明らかではない他の構造が言語にあることに気付きましたが、それには目的があります (たとえば、コードジェネレーターの記述を簡素化します)。

ただし、これがどのように役立つかわかりません。誰もそれを持っているための合理的なユースケース/理論的根拠を考えることができますか?

4

2 に答える 2

3

GCCドキュメントのセクション1.7から:

nullディレクティブは#' followed by a Newline, with only whitespace (including comments) in between. A null directive is understood as a preprocessing directive but has no effect on the preprocessor output. The primary significance of the existence of the null directive is that an input line consisting of just a#'で構成され、 `#'だけを含む出力行ではなく、出力を生成しません。おそらく、いくつかの古いCプログラムにはそのような行が含まれています。

Cプリプロセッサはそれ自体がプログラムであり、入力と出力があることを忘れないでください。Cプリプロセッサの出力には通常、プログラムコメントが含まれますが、コメントが「#」記号で始まる行に表示され、空白とコメント以外の内容がない場合、コメントはプリプロセッサ出力に表示されません。したがって、nullディレクティブを使用すると、コンテンツはソースコードに存在しますが、プリプロセッサ出力には存在しません。

例:

プリプロセッサは変換します

#include <stdio.h>
#define HELLO 1
# /*This comment is for preprocessor only*/
HELLO
/*This comment is for preprocessed code*/

の中へ

(... preprocessed contents of stdio.h ...)
1
/*This comment is for preprocessed code*/   
于 2012-04-05T00:08:33.253 に答える
3

GNUドキュメントから:

.....null ディレクティブの存在の主な意味は、入力行が#' will produce no output, rather than a line of output containing just a#' だけで構成されていることです。おそらく、一部の古い C プログラムにはそのような行が含まれています。

于 2012-04-05T00:01:09.657 に答える