6

私の質問は、マクロと同じ名前の関数がある場合、マクロだけが呼び出されるということですよね?マクロの代わりに関数を呼び出したい場合はどうなりますか?

4

3 に答える 3

14

関数と関数のようなマクロの両方に名前が付けられfooていて、関数バージョンを呼び出したい場合は、次の操作を実行できます。

(foo)(args)

これが機能するのは、関数のようなマクロ名の後に、置換を行うために括弧で囲まれた引数リストを続ける必要があるためです。

これは、ISOC99標準のセクション7.1.4/1に記載されています。

ヘッダーで宣言された関数は、ヘッダーで定義された関数のようなマクロとして追加で実装できます。そのため、ヘッダーが含まれているときにライブラリ関数が明示的に宣言されている場合は、以下に示す手法の1つを使用して、宣言がないことを確認できます。そのようなマクロの影響を受けます。関数のマクロ定義は、関数名を括弧で囲むことによってローカルで抑制できます。これは、名前の後に、マクロ関数名の展開を示す左括弧が続かないためです。同じ構文上の理由から、ライブラリ関数がマクロとしても定義されている場合でも、ライブラリ関数のアドレスを取得することは許可されています。を使用し#undefてマクロ定義を削除すると、実際の関数が確実に参照されます。

ただし、これを行う必要がある場合は、コードにコメントを追加して説明する必要があります。これは、少し奇妙に見え、一般的な方法ではないためです。可能であれば、名前の衝突を避けるために関数の名前を変更すると、長期的にはより保守しやすくなる可能性があります。

于 2013-03-27T08:00:43.863 に答える
1

2つのうちの1つに名前を変更します。または、それが不可能な場合は、マクロを定義する前に元の関数への関数ポインターを作成し、そのポインターを介して関数を呼び出します。

于 2013-03-27T08:00:04.037 に答える
1

電話をかける前にトリックを提供する

#ifdef foo
#undef foo
#endif //

したがって、関数を呼び出す単一のファイルでローカルに実行すると、常に明示的な動作が発生します

于 2013-03-27T08:12:00.257 に答える