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 回答