c - 函数声明的宏不起作用

标签 c macros keil

我想使用宏来轻松更改函数声明,这是我现在拥有的:

#define MYDECLARATION(name)   void name (void)

当我调用 MYDECLARATION(my_thread) 时;我得到一个错误:

identifier-list paramters may only be used in a function definition.

我试过像那样使用##:

#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);

这是有效的...所以我想这是在函数名称中使用宏参数的事实,但它不起作用...

最佳答案

了解预处理输出的最佳方法是使用 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 示例.c

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

  void my_thread (void);
  return 0;
}

你知道,你不能那样调用函数。它应该被称为 my_thread(); 我对你的宏进行了更改 - #define MYDECLARATION(name) name() 它工作正常。希望对您有所帮助。

关于c - 函数声明的宏不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19185038/

相关文章:

c - 您是否特别需要 malloc 来为链表的新元素分配内存

c - 阻止 Keil uvision 在函数调用时推送寄存器

c - 即使具有显式可见性,C 共享库中的某些 C 符号也不会导出

c - 如何在C中输入n个字符串(n由用户输入)而不分配n个空格?

c - 如何重新排序字符数组中的位置

haskell - 是否有可能在 Lisp 中使用宏来实现依赖类型的好处?

excel - 单击用户窗体上的按钮(调用按钮单击事件)

c++ - 使用 SCons 定义 C++ 预处理器宏

c - 如果按顺序声明可分割变量,它们的地址是否递增

alignment - 如何在 Keil uVision 中自动对齐快捷键?