user-0 提问: 函数的宏替换问题，出现了未定义错误

回复:
user: user-1
content: 楼主要搞莫子啊  #define 会替换   楼主是想要定义函数指针类型吧

user: user-0
content: 引用 8 楼 modyaj 的回复: //楼主既然知道宏是简单文字替换 那么楼主认为下面这代码是做什么呢？ fun_cb = do { \     printf("fuck!\n"); \ } while(0)   嗯，对，我前面的 fun_cb = fun1；和上面这个一样，当然编译不过了，所以，要想一边用宏来替换函数，一边又能通过编译，因此还要如大神.xiaohuh421所说的‘宏能最终指向一个函数名.’谢谢你们的指导，受益匪浅啊，谢谢你们 user-4 xiaohuh421 modyaj

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

user: user-3
content: 引用 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) }

user: user-0
content: 引用 4 楼 user-4 的回复:[quote=引用 2 楼 yangyi_33855 的回复:] 谢谢您的回答，对于某个，我只知道是另外一个.c文件里面的，函数名为‘func1’, 形参类型、返回值类型，都不知道，也不关心，这样的话，我要调用‘func1’，还要在这里重新定义一遍么?确实，main()后面写个 void func1(void *ret, uint32_t ret_len) { 	printf("fuck!\n"); 	return; }能编译通过，但是要打桩，做桩函数的话，该怎么定义宏呢？就不能通过函数宏来替换了吗? 1 如果你要使用其他文件中的函数，就要在本文件使用该函数之前声明该函数 2 函数的名称和参数类型和返回值类型共同确定一个函数，差一个都不行 3 宏是简单的文本替换，只要你知道替换具体是怎么执行的，想怎么替换就怎么替换，但如果你只是因为“函数宏中有函数两个字”就认为“它可以用来替换两个函数”，那很抱歉我无能为力[/quote] 谢谢您的回答，我先去了解 宏替换具体是怎么执行的吧，

user: user-0
content: 引用 3 楼 xiaohuh421 的回复:楼主看来完全没有理解宏函数的意思哟. 宏就是做代码替换工作的.  楼主想实现什么功能呢?  函数指针, 仿函数都是很好用的东西呀. 谢谢您的回答。仔细想想自己为什么提这个问题，也是，我都还没弄清楚  宏是否能代替函数定义 来通过编译(表达的好乱)，就来问了。我想了解的场景是这样的：假设 在编译某段程序中，出现了，“****”undeclared的错误，然后，我是否能通过 宏替换掉这个“****”, 来使得编译通过，而至于“****”这段代码，处理过什么数据，返回了什么值，我暂时不关心它，只是说先通过编译。

user: user-4
content: 引用 2 楼 yangyi_33855 的回复:谢谢您的回答，对于某个，我只知道是另外一个.c文件里面的，函数名为‘func1’, 形参类型、返回值类型，都不知道，也不关心，这样的话，我要调用‘func1’，还要在这里重新定义一遍么?确实，main()后面写个 void func1(void *ret, uint32_t ret_len) { 	printf("fuck!\n"); 	return; }能编译通过，但是要打桩，做桩函数的话，该怎么定义宏呢？就不能通过函数宏来替换了吗? 1 如果你要使用其他文件中的函数，就要在本文件使用该函数之前声明该函数 2 函数的名称和参数类型和返回值类型共同确定一个函数，差一个都不行 3 宏是简单的文本替换，只要你知道替换具体是怎么执行的，想怎么替换就怎么替换，但如果你只是因为“函数宏中有函数两个字”就认为“它可以用来替换两个函数”，那很抱歉我无能为力

user: user-3
content: 楼主看来完全没有理解宏函数的意思哟. 宏就是做代码替换工作的.  楼主想实现什么功能呢?  函数指针, 仿函数都是很好用的东西呀.

user: user-0
content: 引用 1 楼 user-4 的回复: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; }能编译通过，但是要打桩，做桩函数的话，该怎么定义宏呢？就不能通过函数宏来替换了吗?

user: user-4
content: 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是一个宏，宏和函数是完全不同的两码事，结束