0

次のようなコードがあるプロジェクトに取り組んでいます。

#define NAME() Array

inline NAME()* NAME()_init (void* arg0){return (NAME()*)Object_init(arg0);}

しかし、次の結果が得られます。

inline Array* Array _init (void* arg0){return (Array*)Object_init(arg0);}

「Array」と「_init」の間にスペースを入れる これは関数名なので、当然スペースは入れたくありません。スペースを空ける方法を知っている人はいますか?

4

2 に答える 2

2

NAME()2 つのトークンを 1 つに結合する (たとえば、 andを呼び出した結果を結合する) 唯一の方法は_init、連結演算子 ( ##) を使用することです。次のようにする必要があります。

#define REAL_CONCATENATE(x, y) x ## y
#define CONCATENATE(x, y) REAL_CONCATENATE(x, y)

#define NAME() Array
inline NAME()* CONCATENATE(NAME(), _init) (void* arg0){return (NAME()*)Object_init(arg0);}

はい、余分なレベルの間接化が必要です。

パラメータを取らない場合は、関数のようなマクロを使用する必要がないことに注意してください。したがって、次のように簡単に使用できます。

#define NAME Array
inline NAME* CONCATENATE(NAME, _init) (void* arg0){return (NAME*)Object_init(arg0);}
于 2010-06-12T17:22:52.853 に答える
1

次のようにセマンティクスを変更する必要があります。

#define NAME(X) Array##X
inline NAME()* NAME(_init) (void* arg0){return (NAME()*)Object_init(arg0);}

EDIT:少なくともGNU cppで動作します。

EDIT2 : も試し-ansi -pedanticてみましたが、警告なしで動作するようでした...

于 2010-06-12T17:21:26.780 に答える