私の質問は:マクロと同じ名前の関数がある場合は、マクロだけが呼び出されるでしょうか?マクロの代わりに関数を呼び出す場合はどうすればよいですか?Cでマクロの代わりに関数を呼び出す
答えて
あなたが機能を持っており、関数のようなマクロがfoo
という名前と機能バージョンを呼び出したいの両方の場合は、あなたが行うことができます:
(foo)(args)
関数のようなマクロ名が続かなければなりませんので、これは動作します置換を行うための引数リストをカッコで囲んだもの。
これはISO C99標準規格のセクション7.1.4/1に記載されている:
ので、もしヘッダ内で宣言する関数は、さらに、ヘッダに定義された関数のようなマクロとして実装することができますライブラリ関数は、そのヘッダが含まれているときに明示的に宣言されていますが、そのようなマクロの影響を受けないように、以下に示す手法の1つを使用できます。関数のマクロ定義は、関数の名前をカッコで囲むことでローカルに抑制することができます。名前の後にマクロ関数名の展開を示す左括弧がないためです。同じ構文上の理由から、たとえそれがマクロとして定義されていても、ライブラリ関数のアドレスを取ることは許されます。任意のマクロ定義を削除するために
#undef
を使用することにより、実際の関数が確実に参照されるようになります。
しかし、これを行う必要がある場合は、少し奇妙に見えて一般的な方法ではないため、コメントにコードを追加する必要があります。実現可能であれば、名前の衝突を避けるために関数の名前を変更することは、長期的にはより保守的かもしれない。
名前を変更してください。または、それが可能でない場合は、マクロを定義してそのポインタを介して関数を呼び出す前に、元の関数へのポインタを作成してください。
明示的な行動を持っています。 'foo'と'&foo'は関数のようなマクロ呼び出しを引き起こしません。しかし、これはオブジェクトのようなマクロのための正しいソリューションです。 – Potatoswatter
は、コール
#ifdef foo
#undef foo
#endif //
前にトリックを提供しますので、ローカル関数を呼び出し、単一のファイルには、常にマクロがその関数のアドレスを取るとは干渉しません
しかし、マクロをバックアップして復元する方法はないので、関数呼び出しの後で使用する必要はありません。 – Potatoswatter
- 1. 基本C++の代わりに導出関数が呼び出される
- 2. 代わり.click()の関数呼び出しでモーダルを開く
- 3. __global__関数内から__global__関数を呼び出す代わりに?
- 4. C#で仮想メソッドを呼び出す代わりに
- 5. psycopg2を使って生のクエリの代わりに関数を呼び出す
- 6. 代入や関数呼び出しが予想され、代わりに式
- 7. Cプログラミング:マクロを使って関数を呼び出す
- 8. argparse:関数の代わりにメソッドを呼び出す方法は?
- 9. 配列の代わりにVectorからクラス関数を呼び出す
- 10. Android Javaからネイティブ関数を呼び出す - JNIの代わりに
- 11. Socket.IO:socket.onを使用する代わりにカスタム関数を呼び出す
- 12. ボタンを押す代わりに関数を呼び出す方法(swift3)
- 13. マクロの代わりにC関数内で__VA_ARGS__を使用する方法は?
- 14. Cのprintfステートメントからのマクロ関数呼び出し
- 15. アクセサリー関数呼び出しの代わりにユーザースタック用のシングル命令プッシュ/ポップ?
- 16. ハッキングC、C funcの代わりにスクリプトfuncを呼び出しますか?
- 17. Pythonのマルチプロセッシングを使用する関数の代わりにクラス内の関数を呼び出す
- 18. 機能介在、マークC関数代わりに常に直接呼び出しのシンボルスタブを使用する
- 19. 関数呼び出しでマクロを使用するには?
- 20. オプションで関数を呼び出すif-letに代わる代替手段はありますか?
- 21. CでVOID関数を呼び出す
- 22. マクロ呼び出しにポインタを返すC API関数をラップします
- 23. C関数呼び出し
- 24. メインで呼び出しを行わずにdll関数を呼び出す
- 25. C++はコピーコンストラクタの代わりにデフォルトのコンストラクタを呼び出します
- 26. このルールの代わりにmakefileのルールを呼び出す
- 27. C++、関数呼び出しからのクラスインスタンスへの代入?
- 28. 別の関数呼び出しで関数を呼び出す
- 29. C++演算子<< std :: ostreamの代わりにostreamを呼び出す
- 30. C++の関数を呼び出す
サイドノート、C++の状況はまったく同じです。 – Potatoswatter
ええ、元の質問のアプローチは、下流のメンテナンスの恐怖を呼び起こします。もし彼がそうしなければならないなら、これは方法です。 –