0

test.cpp

#include <iostream>
void f()
{
    std::cout<<"non-inline"<<std::endl;
}

main.cpp

#include <iostream>
using namespace std;
inline void f()
{
    cout<<"inline"<<endl;
}

int main()
{
    f();
    return 0;
}

デバッグ モードでは、出力は非インラインです。コマンド:g++ [-g] -o メイン main.cpp test.cpp

リリース モードでは、出力は次のとおりです。インライン。コマンド:g++ -O -o メイン main.cpp test.cpp

なんで?

Linux G++ 4.7.3

C99 では、インライン定義は関数の外部定義を提供しないため、別のソース ファイルで別の関数を定義することにより、識別子の外部定義を提供できます。

インライン定義は、C++ の関数の外部定義を提供しますか??

どうも!!

4

2 に答える 2

6

の 2 つの異なる定義を提供することにより、ODR (One Definition Rule) に違反しているため、プログラムには UB (Undefined Behaviour) がありf()ます。したがって、それが何らかの方法で動作する理由を推論する方法はほとんどありません。UB の最良の伝統では、あらゆる動作が可能です (インターネット経由でピザを注文することを含む)。

編集

標準 (ISO/IEC 14882:2011) からのこれらの引用は、それが UB であることを証明しています。

[basic.def.odr]§3:

すべてのプログラムには、そのプログラムで ODR で使用されるすべての非インライン関数または変数の定義が 1 つだけ含まれている必要があります。診断は必要ありません。... インライン関数は、odr が使用されるすべての翻訳単位で定義する必要があります。

[basic.def.odr]§5:

各定義が異なる翻訳単位に現れ、定義が次の要件を満たしている場合、プログラム内に ... 外部リンケージを持つインライン関数 ... の複数の定義があってもかまいません。D という名前のエンティティが複数の翻訳単位で定義されている場合、

  • D の各定義は、同じ一連のトークンで構成されます。と
  • ...

[dcl.fct.spec]§4

インライン関数は、odr が使用されるすべての翻訳単位で定義され、すべての場合でまったく同じ定義を持つものとします (3.2)。[注:インライン関数の呼び出しは、その定義が翻訳単位に現れる前に発生する場合があります。-end note ] 関数の定義が、インラインとして最初に宣言される前に翻訳単位に現れる場合、プログラムは不正な形式です。外部リンケージを持つ関数が 1 つの翻訳単位でインラインで宣言されている場合、それが現れるすべての翻訳単位でインラインで宣言されなければなりません。診断は必要ありません。...

(私のものを強調)

于 2013-09-05T06:39:51.243 に答える