难题,请教高手宏的#/##用法!这个宏应该如何定义呢?

hjleochen 2003-09-29 06:57:15


#include <stdio.h>
#include <stdlib.h>

#define xb(a) ???????????????????

void AS();
void BS();

int main(void)
{
char *a="AS";
void (*p)();
p = xb(a);
p();
}

void AS()
{
printf("As\n");
}



这个xb(a)应该如何定义才能使程序合法呢?并正确调用AS函数呢?谢谢!
...全文
84 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
fierygnu 2003-10-04
  • 打赏
  • 举报
回复
可以直接用p()方式调用。
用dl要注意C++的mangle问题。
hjleochen 2003-10-03
  • 打赏
  • 举报
回复
to xx2j(x2j) :是(*p)()指向function的指明针。
我知道用动态库怎么实现
两个地方是我们需要的

#include <dlfcn.h>
#include <stdio.h>

main()
{
void *libc;
void (*printf_call)();

if(libc=dlopen("/lib/libc.so.5",RTLD_LAZY)) // 相当于Class.forName()
{
printf_call=dlsym(libc,"printf"); // get method
(*printf_call)("hello, world\n"); // invoke method
}

}
fierygnu 2003-09-30
  • 打赏
  • 举报
回复
楼主的理解正确,是不能实现。
C语言里的多态只能用函数指针实现。blh的方法可以,如果很多函数又要效率,可以先建一个hash表。
blh 2003-09-30
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef void (*func_call)(void);


void AS();
void BS();

func_call xb(char* a)
{
if (strcmp(a, "AS") == 0)
return AS;
else if(strcmp(a, "BS") == 0)
return BS;
return 0;
}

int main(void)
{
char *a="AS";
void (*p)();
p = xb(a);
p();
}

void AS()
{
printf("As\n");
}

void BS()
{
printf("BS\n");
}
hjleochen 2003-09-30
  • 打赏
  • 举报
回复
hehe,谢谢各位的热情回复,其实我的本意是想实现一个根据函数名字符串调用此函数的功能
类似于java中的class.forname
也就是希望将char *a的值当做函数名来调用。

但是我昨天晚上考虑了一下这样似乎是不可行的。因为宏是在预编译中进行转换的,而变量char *a的值是在运行期可设置的。所以不能用这种方法实现动态调用。不知道理解对不对。
earthwind 2003-09-30
  • 打赏
  • 举报
回复
我记得以前看到过,很象是可以的。
xx2j 2003-09-30
  • 打赏
  • 举报
回复
想问一下是p() 还是(*p)()?
hjleochen 2003-09-30
  • 打赏
  • 举报
回复
to fierygnu(va_list) :
hehe,我现在也是用链表实现了。

blh的方法,我想如果都是if的方法来解决的话,那我也没这个问题。
aria 2003-09-29
  • 打赏
  • 举报
回复
sorry, 直接定义#define xb(a) AS即可
aria 2003-09-29
  • 打赏
  • 举报
回复
#define xb(a) A##S
内容概要:本文详细介绍了Anaconda的下载、安装与配置方法(2025最新版)。Anaconda是一个开源的Python/R数据科学集成开发平台,预装了1500多个科学计算库,并提供conda包管理和环境管理功能。文章首先列出了系统要求,接着分别讲述了适用于不同操作系统的下载方式,包括官方下载和国内镜像下载。然后,具体讲解了Windows、macOS和Linux三种操作系统的安装步骤,以及环境变量的手动配置方法。此外,还提供了验证安装是否成功的命令和配置国内镜像源的方法,以提高下载速度。最后,列出了一些常用conda命令和常见问题的解决方案。 适合人群:从事数据科学、机器学习领域的研究人员和开发者,特别是需要频繁使用Python科学计算库的用户。 使用场景及目标:①帮助用户快速搭建Python开发环境,尤其是需要多个Python版本共存或隔离环境的情况下;②解决因网络原因导致的下载速度慢的问题;③提供详细的安装指南,确保安装过程顺利进行;④指导用户正确配置环境变量,避免常见的安装后无法使用的错误。 阅读建议:由于Anaconda涉及多平台安装和配置,建议读者根据自己的操作系统选择相应的章节重点阅读,并严格按照步骤操作。对于初次使用者,建议先从简单的安装入手,再逐步学习环境管理和包管理的相关命令。

23,217

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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