搜索
bottom↓
回复: 7

如何实现函数名和函数变量可以对应着改变

[复制链接]

出0入0汤圆

发表于 2011-1-21 14:38:58 | 显示全部楼层 |阅读模式
我示意下,不知道具体怎么做
只需要定义一个函数
void SetPort#x#
{
    P#x#=0xffffff;
}
调用:
SetPort0();//实现的是P0=0XFFFFFF;
SetPort1();//实现的是P1=0XFFFFFF;
SetPort2();//实现的是P2=0XFFFFFF;
哪个编译器可以实现?
具体的编译字是什么?

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2011-1-22 19:20:34 | 显示全部楼层
你试下用宏来定义函数

出0入0汤圆

发表于 2011-1-23 00:37:35 | 显示全部楼层
感觉不可能……

出0入70汤圆

发表于 2011-1-23 01:12:32 | 显示全部楼层
回复【楼主位】lhdzwkk  
我示意下,不知道具体怎么做
只需要定义一个函数
void setport#x#
{
    p#x#=0xffffff;
}
调用:
setport0();//实现的是p0=0xffffff;
setport1();//实现的是p1=0xffffff;
setport2();//实现的是p2=0xffffff;
哪个编译器可以实现?
具体的编译字是什么?

-----------------------------------------------------------------------

看看你自己的调用,这是一个函数吗?既然不是那么怎么能做到“只需要定义一个函数”呢?
通常可变的部分可以作为函数的参数啊,
void setport(void* port)
{
    *port = 0xffffffff;
}
调用的时候把端口地址传进去就行了。

如果这样也不好操作的话参数变成一整数,里面case switch一下也很方便。

用宏替换是可以实现你想要的不同函数名对应不同变量,但那也不是只定义了一次,有几个函数还是要把这个宏写几遍。

出0入42汤圆

发表于 2011-1-23 02:37:24 | 显示全部楼层
#include <stdio.h>

int var_a = 1;
int var_b = 2;

#define macro1(a)    #a
#define macro2(a,b)  a##b
#define macro3(a,b)  a##b = 100

int main(void)
{
        macro3(var_, a);
        printf("%s = %d\n", macro1(var_a), macro2(var_,a));
        return 0;
}

===============================
var_a = 100

出0入42汤圆

发表于 2011-1-23 11:01:24 | 显示全部楼层
这么好个帖子...居然来自0积分用户

出0入0汤圆

 楼主| 发表于 2011-6-14 12:48:56 | 显示全部楼层
最近搞zigbee IAR8051环境看到了这种做法:
#define HAL_CONFIG_IO_OUTPUT_PREP(port, pin, val) st( P##port##SEL &= ~BV(pin); \
                                                      P##port##_##pin## = val; \
                                                      P##port##DIR |= BV(pin); )

犀利的用法呵呵
应该别的编译器也有类似功能吧 留个脚印

顺便提下st()宏只是为了给扩个括号呵呵,反斜杠是换行表达
宏,不是函数,虽然调用的时候像个函数,这个叫什么函数来着?记性不好,哎...

出0入0汤圆

 楼主| 发表于 2011-6-14 12:49:55 | 显示全部楼层
回复【4楼】albert_w
#include &lt;stdio.h&gt;
int var_a = 1;
int var_b = 2;
#define macro1(a)    #a
#define macro2(a,b)  a##b
#define macro3(a,b)  a##b = 100
int main(void)
{
        macro3(var_, a);
        printf("%s = %d\n", macro1(var_a), macro2(var_,a));
        return 0;
}
===============================
var_a = 100

-----------------------------------------------------------------------

已经有这个味道了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 21:26

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表