6

再現手順:

次の行を c++ ソース コードの任意の行に挿入します。

#1234

最初の行、最後の行を含む任意の行。このように関数のヘッダとボディの間に入力することもできます。

int foo()
#1234
{
return 0;
}

この数字は非常に長くなる可能性があります。私は 170 文字以上をテストしました。数字以外の文字を追加すると、コンパイル エラーが発生します。

私の質問は、# の後に数字が続くとコンパイルが壊れないのに、# の後に数字以外の文字が続くとコンパイルが壊れないのはなぜですか。

お時間をいただきありがとうございます。

4

2 に答える 2

11

それはラインディレクティブです。ほとんどのプリプロセッサはこれらを出力して、実際に元のソース ファイルのどの行にあるかをコンパイラに伝えます。

プリプロセッサは、コンパイラに提供するソースに多くの行 (場合によっては数百または数千行) を追加できるため、コンパイラは元のソース ファイルの行番号を追跡する必要があります。これは、そのような特別なディレクティブを通じて行われます。

于 2013-05-13T09:45:05.323 に答える
6

GCC でコンパイルすると、次の警告が表示されます。

warning: style of line directive is a GCC extension [enabled by default]

つまり、これは標準 C++ ではなく、特定のコンパイラ拡張 (この場合はプリプロセッサ拡張、特にline ディレクティブ) です。

したがって、コンパイラのドキュメントを参照して、許可されているものと許可されていないものを正確に確認する必要があります。たとえば、これを参照してください

于 2013-05-13T09:45:41.980 に答える