c++ - c言語 - __line__ 文字列



新しい__LINE__はいつ始まりますか? (3)

私は次のプログラムの出力を理解していません。

#include <iostream>

#define FOO std::cout << __LINE__ << ' ' \
                      << __LINE__ << '\n';
int main()
{
    FOO

    std::cout << __LINE__ << ' ' \
              << __LINE__ << '\n';
}

最初の出力は77FOOの拡張が単一の論理行であることを示しますが、2番目の出力は910 、2つの異なる論理行を示しています。 なぜ違いがありますか?


1つの行として常に評価される#define文で定義したものを引き起こします。 しかし、2番目のケースは本当に2行のコードです。


Fooを置換するには、定義済みのディレクティブ_ _ LINE _ _を評価する必要があります。 これは、_ _ LINE _ _を評価するための2番目の前処理パスがないためです。

したがって、_ _LINE _ _は、Fooが展開されている行、つまり7行目に基づいて評価されます。

コードの後続行で_ _ LINE _ _を使用することは、翻訳ユニットのソースコードに表示される正確な行番号に基づいて、前処理段階で実際に評価されます。


なぜなら

1:  #include <iostream>
2: 
3:  #define FOO std::cout << __LINE__ << ' ' \
4:                        << __LINE__ << '\n';
5:  int main()
6:  {
7:      FOO // the first two __LINE__s come from here, that's one line of code
8: 
9:      std::cout << __LINE__ << ' ' \ // 3rd __LINE__ comes from here
10:              << __LINE__ << '\n'; // 4th __LINE__ comes from here
11: }

__LINE__は論理行ではなく物理行に展開され__LINE__

現在のソース行の行番号は、ソースファイルを現在のトークンに処理中に、翻訳フェーズ1(2.2)で読み込まれた、または改行文字の数より1多いです。

\終わる行は翻訳フェーズ2で連結されます。

他の唯一の論理的な実装は、FOOの呼び出しのために3と4を出力することですが、あまり役に立ちません。

これを次のように見ることもできます: __LINE__は他のマクロと全く同じです。 これはちょうどすべての行頭のコンパイラによって自動的に更新されます。 コードはこのように解釈されます。

#include <iostream>

#define __LINE__ 3
#define FOO std::cout << __LINE__ << ' ' \
                      << __LINE__ << '\n';
int main()
{
#define __LINE__ 7
    FOO

#define __LINE__ 9
    std::cout << __LINE__ << ' ' \ // Yeah, you're right
#define __LINE__ 10
             << __LINE__ << '\n';
}

これは有効なコードではありませんが、どのように動作するかを示しています。 通常のマクロ展開ルールを適用すると、得られた出力が得られます。





c-preprocessor