函数的宏替换问题,出现了未定义错误

yangyi_33855 2013-09-28 10:58:38
代码不多,如下:
#include <stdio.h>
#define uint32_t unsigned int
#define func1(ret, ret_len) do { \
printf("fuck!\n"); \
} while(0)

typedef void (*SS_FP_APPMNG_CB)(void *, uint32_t);

int main(void)
{
SS_FP_APPMNG_CB fun_cb;
fun_cb = func1;

return 0;
}

/******************************/
编译之后出现错误:
‘func1’ undeclared(first use........)
请教各位大神,这个问题怎么解决呢?
...全文
281 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
SKATE11 2013-09-28
  • 打赏
  • 举报
回复
楼主要搞莫子啊 #define 会替换 楼主是想要定义函数指针类型吧
yangyi_33855 2013-09-28
  • 打赏
  • 举报
回复
引用 8 楼 modyaj 的回复:

//楼主既然知道宏是简单文字替换 那么楼主认为下面这代码是做什么呢?
fun_cb = do { \
    printf("fuck!\n"); \
} while(0)

嗯,对,我前面的 fun_cb = fun1;和上面这个一样,当然编译不过了,所以,要想一边用宏来替换函数,一边又能通过编译,因此还要如大神.xiaohuh421所说的‘宏能最终指向一个函数名.’谢谢你们的指导,受益匪浅啊,谢谢你们 baichi4141 xiaohuh421 modyaj
modyaj 2013-09-28
  • 打赏
  • 举报
回复

//楼主既然知道宏是简单文字替换 那么楼主认为下面这代码是做什么呢?
fun_cb = do { \
    printf("fuck!\n"); \
} while(0)

xiaohuh421 2013-09-28
  • 打赏
  • 举报
回复
引用 5 楼 yangyi_33855 的回复:
[quote=引用 3 楼 xiaohuh421 的回复:] 楼主看来完全没有理解宏函数的意思哟. 宏就是做代码替换工作的. 楼主想实现什么功能呢? 函数指针, 仿函数都是很好用的东西呀.
谢谢您的回答。仔细想想自己为什么提这个问题,也是,我都还没弄清楚 宏是否能代替函数定义 来通过编译(表达的好乱),就来问了。我想了解的场景是这样的:假设 在编译某段程序中,出现了,“****”undeclared的错误,然后,我是否能通过 宏替换掉这个“****”, 来使得编译通过,而至于“****”这段代码,处理过什么数据,返回了什么值,我暂时不关心它,只是说先通过编译。[/quote] 这要看函数是怎么调用的, 如果说是函数指针的赋值, 那么告诉你, 宏是办不到的. SS_FP_APPMNG_CB fun_cb; fun_cb = func1; //这里不能用宏函数代替, 只能用实际的函数名.或者宏能最终指向一个函数名. 但如果是只调用函数. func1(xxx,xxx); 这里就以用函数宏代替掉. 你只要理解到, 宏, 只是作代码替换. 比如还是你定义的宏: int main() { int ret=0, ret_len=0; func1(ret,ret_len); } 编译时替换成: int main() { int ret=0, ret_len=0; do{ printf("fuck!\n"); }while(0) }
yangyi_33855 2013-09-28
  • 打赏
  • 举报
回复
引用 4 楼 baichi4141 的回复:
[quote=引用 2 楼 yangyi_33855 的回复:] 谢谢您的回答,对于某个,我只知道是另外一个.c文件里面的,函数名为‘func1’, 形参类型、返回值类型,都不知道,也不关心,这样的话,我要调用‘func1’,还要在这里重新定义一遍么?确实,main()后面写个 void func1(void *ret, uint32_t ret_len) { printf("fuck!\n"); return; }能编译通过,但是要打桩,做桩函数的话,该怎么定义宏呢?就不能通过函数宏来替换了吗?
1 如果你要使用其他文件中的函数,就要在本文件使用该函数之前声明该函数 2 函数的名称和参数类型和返回值类型共同确定一个函数,差一个都不行 3 宏是简单的文本替换,只要你知道替换具体是怎么执行的,想怎么替换就怎么替换,但如果你只是因为“函数宏中有函数两个字”就认为“它可以用来替换两个函数”,那很抱歉我无能为力[/quote] 谢谢您的回答,我先去了解 宏替换具体是怎么执行的吧,
yangyi_33855 2013-09-28
  • 打赏
  • 举报
回复
引用 3 楼 xiaohuh421 的回复:
楼主看来完全没有理解宏函数的意思哟. 宏就是做代码替换工作的. 楼主想实现什么功能呢? 函数指针, 仿函数都是很好用的东西呀.
谢谢您的回答。仔细想想自己为什么提这个问题,也是,我都还没弄清楚 宏是否能代替函数定义 来通过编译(表达的好乱),就来问了。我想了解的场景是这样的:假设 在编译某段程序中,出现了,“****”undeclared的错误,然后,我是否能通过 宏替换掉这个“****”, 来使得编译通过,而至于“****”这段代码,处理过什么数据,返回了什么值,我暂时不关心它,只是说先通过编译。
baichi4141 2013-09-28
  • 打赏
  • 举报
回复
引用 2 楼 yangyi_33855 的回复:
谢谢您的回答,对于某个,我只知道是另外一个.c文件里面的,函数名为‘func1’, 形参类型、返回值类型,都不知道,也不关心,这样的话,我要调用‘func1’,还要在这里重新定义一遍么?确实,main()后面写个 void func1(void *ret, uint32_t ret_len) { printf("fuck!\n"); return; }能编译通过,但是要打桩,做桩函数的话,该怎么定义宏呢?就不能通过函数宏来替换了吗?
1 如果你要使用其他文件中的函数,就要在本文件使用该函数之前声明该函数 2 函数的名称和参数类型和返回值类型共同确定一个函数,差一个都不行 3 宏是简单的文本替换,只要你知道替换具体是怎么执行的,想怎么替换就怎么替换,但如果你只是因为“函数宏中有函数两个字”就认为“它可以用来替换两个函数”,那很抱歉我无能为力
xiaohuh421 2013-09-28
  • 打赏
  • 举报
回复
楼主看来完全没有理解宏函数的意思哟. 宏就是做代码替换工作的. 楼主想实现什么功能呢? 函数指针, 仿函数都是很好用的东西呀.
yangyi_33855 2013-09-28
  • 打赏
  • 举报
回复
引用 1 楼 baichi4141 的回复:
typedef void (*SS_FP_APPMNG_CB)(void *, uint32_t); 这一句声明了一个新的函数指针类型SS_FP_APPMNG_CB SS_FP_APPMNG_CB fun_cb; 这一句定义了一个函数指针fun_cb fun_cb = func1; 函数指针指向了一个不认识的东西 为什么呢,看看func1是什么 #define func1(ret, ret_len) do { \ printf("fuck!\n"); \ } while(0) 嗯,func1是一个宏,宏和函数是完全不同的两码事,结束
谢谢您的回答,对于某个,我只知道是另外一个.c文件里面的,函数名为‘func1’, 形参类型、返回值类型,都不知道,也不关心,这样的话,我要调用‘func1’,还要在这里重新定义一遍么?确实,main()后面写个 void func1(void *ret, uint32_t ret_len) { printf("fuck!\n"); return; }能编译通过,但是要打桩,做桩函数的话,该怎么定义宏呢?就不能通过函数宏来替换了吗?
baichi4141 2013-09-28
  • 打赏
  • 举报
回复
typedef void (*SS_FP_APPMNG_CB)(void *, uint32_t); 这一句声明了一个新的函数指针类型SS_FP_APPMNG_CB SS_FP_APPMNG_CB fun_cb; 这一句定义了一个函数指针fun_cb fun_cb = func1; 函数指针指向了一个不认识的东西 为什么呢,看看func1是什么 #define func1(ret, ret_len) do { \ printf("fuck!\n"); \ } while(0) 嗯,func1是一个宏,宏和函数是完全不同的两码事,结束

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧