2015-12-24 2 views
14

私はCについての本を読んでいます。著者のコードのどこかで、関数プロトタイプの定義を見つけてから、同じ名前のマクロを見つけました。関数.hまたは.cファイル。なぜ関数プロトタイプを定義し、同じ名前のプリプロセッサマクロを定義するのですか?

私はそのような何か意味:

int print_my_stufff(char *stuff); 
#define print_my_stuff(A) (printf("%s\n", A)) 
/* and print-my-stuff() function never defined anywhere else */ 

コード作品を、彼は最初の場所で関数プロトタイプを必要となぜ私はちょうど得ることはありませんか?彼は単にマクロを書くことができませんでしたか?ポイントは何ですか?マクロは、intまたは何を返す式に評価する必要があることをコンパイラに伝えるのでしょうか?プロトタイプを削除しても、動作が変更されないようです。著者はこれを説明しなかった。

+0

おそらく、マクロを文書化することです。特に戻り値の型とパラメータの型。著者は、本のためだけにそれをしているかもしれないし、著者はそれが一般的に良い習慣であると考えるかもしれない。 – kaylum

+0

私は実際には使用されたことは一度も見たことがないので、推測することができます:おそらくプロトタイプはマクロのパラメータタイプを文書化するためのものでしょうか? –

+1

@kaylumそれでは、コメントを書いてみませんか? '// this macro does foo' – Arc676

答えて

8

これは、以前のバージョンのinlineの機能です。 print_my_stuff("hello")のように関数を呼び出すと、プリプロセッサーは呼び出し構文を見て、マクロの内容を挿入します。それ以外の場合は、f_ptr = &print_my_stuffのように名前を使用すると、コンパイラは実際の関数を使用します。

(print_my_stuff)("hello")という名前の関数を呼び出すと、マクロもバイパスされます。いくつかの編集的スタイルのガイドでは、Macros Are Evilのために特定の関数名をカッコで囲む必要があります。

+0

最初のケースでは、どのアドレスを使用しますか?関数には本体がありません –

+0

@AndréFratelliどのケースが最初のケースですか?マクロが使用されている場合は、決して機能を認識しません。 – Potatoswatter

+0

ここでは 'f_ptr =&print_my_stuffのように名前を使用するとコンパイラは実際の関数を使用します。'アドレスは取得されていますが、どのアドレスですか? –

関連する問題