2017-08-20 2 views
2

私は何かを試すことにしました。私はマクロが悪いことを知っているので避けてはいけませんが、もし私がそうしたことをしたら何が起こるのかを見たいと思っていました。私がコメントアウトした場合インライン関数とマクロ関数を混ぜる

Macro: 8 

#defineラインインラインが動作を開始し、出力はInline: 8に変身:

#include <iostream> 
using namespace std; 
inline void add(int x, int y) { cout << "Inline: " << x + y << endl; } 
#define add(x,y) (cout << "Macro: " << x + y << endl) 

int main() 
{ 
    add(3,5); 
} 

それは出力します。

私の質問は、コンパイラがインラインではなくマクロ関数を使用することを決めた理由です。ありがとうございました!

私はパラメータなしg++ -g t2.cpp -o t2と、Linux Mint 18.2g++ 5.4.0を使用しています。

答えて

5

マクロ置換はの前処理で行われ、コンパイルの前に実行されます。したがって、コンパイラはadd(3,5)を見ることはありません。マクロ展開のみが表示されます。

+0

ああ、そういうわけで、その周りに '#define'があると' inline'は無視されます。 '#define'が' add(3,5) 'を置き換えるためです。ありがとうございました! 10分後にあなたの答えを受け入れるでしょう。 stackoverflowは時間を制限するので –

+2

コンパイラは "インラインを無視"しません - 'add(3,5)'関数呼び出しはまったく表示されないので、 'add'関数をインラインで呼び出すことはできません。 –

2

マクロは、それが定義されている場所でを達成するために来るので、インライン関数はは、マクロで置き換えられることはありませんが、あなたの呼び出しは、コンパイル前に交換されます。また、マクロはではなく、の関数であることに注意してください。プリプロセッサにはテキストの置換パターンが記載されています。

次のコマンドを実行し、出力ファイル(your.i

g++ -o your.i -E your.cpp 
      ^  

を参照してくださいそして、あなたは、インライン関数はマクロ:) G ++手段のための

オプション-E」の影響を受けません見つけることができますソースファイルを前処理しますが、コンパイルしないで、アセンブルしないでリンクしないでください。

+0

大丈夫です。それは面白いです。毎日新しいことを学ぶ。ありがとうございましたiBug!私はNeil Butterworthの答えで何が起こっているのか理解しています。今、私は出力ファイルを見る方法を知っています! **編集:**私に '-E'フラグを教えてくれてありがとう。 –

+0

@TuğberkKaanDumanあなたが役に立つと思うなら、この回答を「受け入れられた」とマークすることができます。 – iBug

+0

私は-Eを試して、18166行のファイルを出力しました。それは普通ですか? o_o –

2

「マクロ機能」はありません。コンパイラ(実際にプリプロセッサ)はちょうどmainに変わります。

int main() 
{ 
    (cout << "Macro: " << 3 + 5 << endl); 
} 
+0

私はその名前を知らなかった。申し訳ありませんが、代わりにマクロを選択する理由は何ですか? –

+1

@TuğberkKaanDumanプリプロセッサはコンパイラより前に実行され、すべてのマクロ呼び出しが本体で置き換えられます。だから、コンパイラが実際にコンパイルを開始するときには、そこでは 'add'コールはもうありません。 – VTT

+0

ありがとう@VTT。今私はそれをよりよく理解しました! –

関連する問題