3

関数宣言を簡単に変更するためにマクロを使用したいのですが、今のところは次のとおりです。

#define MYDECLARATION(name)   void name (void)

MYDECLARATION(my_thread); を呼び出すと、エラーが発生します:

識別子リスト パラメータは、関数定義でのみ使用できます。

私はそのように ## を使用しようとしました:

#define MYDECLARATION(name)   void  ##name (void)

しかし、コードで : が得られると確信voidmythread (void)しています。それを行う方法について何か考えはありますか?

また、一般的なマクロに関するいくつかの優れたチュートリアルを知っているかどうかも興味があります.


ビットマスク コメントへの応答:

私はKEILコンパイラを使用しており、スレッドは次のように機能しています:

 #define MYDECLARATION(name)   __task void name(void)

私の電話:

 MYDECLARATION(Mythread); 

私の定義:

__task void Mythread(void)
{
  //...
}

新しいテスト:

#define RET_TEST     __task void
#define PARAMETER    void

 RET_TEST MYDECLARATION(PARAMETER);

これは機能しています...だから、機能していない関数名にマクロパラメータを使用するのは事実だと思います...

4

1 に答える 1

1

前処理の出力を理解する最善の方法は、gcc の -E オプションを使用することです。

どうやら、私はあなたのプログラムをコピーしました。

#define MYDECLARATION(name)    void name (void)

#include "stdio.h"


void my_thread()
{
  printf("hello world\r\n");    
    
}


int main(int argc, char **argv)
{

  MYDECLARATION(my_thread);
  return 0;
}

さて、$gcc -E example.c

int main(int argc, char **argv)
{

  void my_thread (void);
  return 0;
}

そのような関数を呼び出すことはできません。my_thread(); として呼び出す必要があります。マクロを変更しました - #define MYDECLARATION(name) name() 正常に動作します。これがお役に立てば幸いです。

于 2013-10-07T14:32:30.563 に答える