2

libspatialindexのソース コードを理解しようとしています。C++ を初めて使用するので、マクロの概念に頭を悩ませています。ライブラリの C 用 API ラッパーであるsidx_api.ccには、直接的または間接的に多数のヘッダーが含まれています。そのうちの 2 つは、「undef」を使用せずに、動的ライブラリとのインターフェイスに関係する同じマクロを定義しているように見えます。

Tools.h

45 #if (defined _WIN32 || defined _WIN64 || defined WIN32 || defined WIN64) && !defined __GNUC__
46  #ifdef SIDX_DLL_EXPORT
47  #define SIDX_DLL __declspec(dllexport)
48  #else
49  #define SIDX_DLL __declspec(dllimport)
50  #endif
51 
52  // Nuke this annoying warning. See http://www.unknownroad.com/rtfm/VisualStudio/warningC4251.html
53 #pragma warning( disable: 4251 )
54 
55 #else
56  #define SIDX_DLL
57 #endif

sidx_export.h

29 #pragma once
30 
31 #ifndef SIDX_C_DLL  
32 #if defined(_MSC_VER)
33 # define SIDX_C_DLL __declspec(dllexport)
34 # define SIDX_DLL __declspec(dllexport)
35 #else
36 # if defined(USE_GCC_VISIBILITY_FLAG)
37 # define SIDX_C_DLL __attribute__ ((visibility("default")))
38 # define SIDX_DLL __attribute__ ((visibility("default")))
39 # else
40 # define SIDX_C_DLL
41 # define SIDX_DLL
42 # endif
43 #endif
44 #endif

「undef」なしでマクロを再定義することには問題があると思います。たとえば、こちらこちらで説明されています。ここで何か不足していますか?ありがとう。

4

2 に答える 2

2

再定義する場合は、まったく同じ前処理トークンのリストを使用して再定義する必要があります。これは、関数マクロとオブジェクト マクロに当てはまります。

から 6.10.3 Macroreplacement p2:

オブジェクトのようなマクロとして現在定義されている識別子 は、2 番目の定義がオブジェクトのようなマクロ定義であり、2 つの置換リストが同一でない限り、別の #define 前処理ディレクティブによって再定義されません。

同様に、関数のようなマクロとして現在定義されている識別子 は、2 番目の定義が同じ数とパラメーターのスペルを持つ関数のようなマクロ定義であり、2 つの置換リストが同一でない限り、別の #define 前処理ディレクティブによって再定義されません。 .

したがって、この定義は を使用しますshall

さて、から4.Conformance p2

制約の外側にある「しなければならない」または「してはならない」要件に違反した場合、動作は未定義です。

これが公式の定義です。したがって、マクロ シンボルを再定義する前に (#undef を使用して) プリプロセッサの環境からマクロ シンボルを削除しないと、未定義の動作が発生します。

C の一部の実装で他の状況が見られる場合、これは標準化されていません。

正しくは、外部で設定した条件の関数に異なる定義を挿入することです。

#if COND
#define M M1
#else
#define M M2
#endif

それを再定義するライブラリを使用する場合、確かに、を設定しCONDて物事を明確に定義するマクロがいくつかあります。ライブラリの使い方を学ぶ必要があります。pp トークンの別のリストで再定義することは無効です。

于 2019-06-11T09:22:10.763 に答える