2009-04-12 11 views

答えて

6

これらは同じものではありません。 CまたはObjective-Cの関数は、いくつかの手続き型コードを単一の単位にまとめたものです。それは非常に具体的なセマンティクスを持っており、より高度な書籍でもっと高度な情報を使って基本的なCの本で読むことができます。

一方、マクロはコンパイルの前処理段階で作成され、実際のバイナリの別の部分ではありません。マクロを使用すると、問題が発生する前に実際にコード内でマクロが置換され、マクロが使用されている場所にコピーが挿入されます。そのため、マクロを使用する際には副作用が重要です(マクロが同じ引数を複数回使用すると副作用が複数回発生するため)。ここで

マクロ説明する簡単な例です:あなたはどのように副作用見ることができます

printf("%s\n%s\n", "Hello, macro!", "Hello, macro!"); 

:前処理中

#define SHOW_STRING_TWICE(string) printf("%s\n%s\n", string, string) 

// ... 

SHOW_STRING_TWICE("Hello, macro!"); 

を、マクロがこのコードに展開されますこのコードの問題:

#define DOUBLE_NUMBER(number) ((number) + (number)) 

// ... 

int doubleRandom = DOUBLE_NUMBER(generate_random_number()); 

この場合、マクロが展開されると、generate_random_number()i実際に2回呼び出されるのは、1回だけ呼び出されると予想されるときです。

関連する問題