你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

(已解决)C编程宏定义函数

[复制链接]
与龙共舞 提问时间:2018-6-28 10:41 /
本帖最后由 与龙共舞 于 2018-7-3 18:04 编辑

抽象一个问题,我选择一个变量出来,然后使用。
  1. 1 #include<stdio.h>
  2.   2    int A,B,C;
  3.   3    #define Pick(a)   (a)?(A):(B)
  4.   4    void main()
  5.   5    {
  6.   6     printf("%d\t%d\t%d\n",A,B,C);
  7.   7     C=Pick(1);
  8.   8     printf("%d\t%d\t%d\n",A,B,C);
  9.   9    }
  10. ~         
复制代码
如此是可以的 Pick(1)就是把A选出来,赋值给C。 Pick(0)就是把B选出来,赋值给C。


实际问题并不是这样的,应该是:
  1. 1 #include<stdio.h>
  2.   2    int A,B,C;
  3.   3    #define Pick(a)   (a)?(A):(B)
  4.   4    void main()
  5.   5    {
  6.   6     printf("%d\t%d\t%d\n",A,B,C);
  7.   7     Pick(1)=C;
  8.   8     printf("%d\t%d\t%d\n",A,B,C);
  9.   9    }
  10. ~         
复制代码
就是第七句话不同 ,其实我是想PICK一个出来,对其赋值。
那么问题来了,这样是编译失败的,=左值是常量不可以赋值,失败。
类似的写出函数也是失败的
  1.   1 #include<stdio.h>
  2.   2 int A,B,C;
  3.   3 int Pick(int a)
  4.   4   {
  5.   5     int tem=a?A:B;
  6.   6     return  tem;}
  7.   7   }
  8.   8
  9.   9  void main()
  10. 10    {
  11. 11     printf("%d\t%d\t%d\n",A,B,C);
  12. 12     Pick(1)=C;----FAIL!!!!!!
  13. 13     printf("%d\t%d\t%d\n",A,B,C);
  14. 14    }
复制代码
函数不能作为左值!只能如下
  1. 2   int A,B,C;
  2.   3   void Pick(int a,int *b)
  3.   4     {
  4.   5       *b = a ? A : B;
  5.   7     }
  6.   8
  7.   9    void main()
  8. 10      {
  9. 11       printf("%d\t%d\t%d\n",A,B,C);
  10. 12       Pick(1, &C);
  11. 13       printf("%d\t%d\t%d\n",A,B,C);
  12. 14      }
复制代码


那么该如何修改呢?
不希望写成函数形式的,写成宏定义形式的比较好。

收藏 评论9 发布时间:2018-6-28 10:41

举报

9个回答
yu0405jie 回答时间:2018-6-28 15:59:16
  1. int A, B;

  2. #define PICK(c) *((c)?(&A):(&B))
复制代码

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

Mandelbrot_Set 回答时间:2018-6-28 11:47:39
  1. int a,b;
  2. #define pick_1  a
  3. #define pick_2  b
  4. #define pick(x) pick_##x
复制代码

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

回答时间:2018-6-28 11:05:37
楼主,我们探讨一下。我一般使用的时候前面是表达式(a==1)?A:B;从理论上来分析,a==1这里是一个表达式,这样改一下是否可以?

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

stm1024 回答时间:2018-6-28 11:05:58
绝对地址赋值,如何?

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

回答时间:2018-6-28 11:14:12
这样改一下:  #define Pick(a,A,B)   (a)?(A)B)
xiajintaord 回答时间:2018-6-28 11:20:14
本帖最后由 xiajintaord 于 2018-6-28 11:26 编辑

所以,楼主希望 条件运算符给你返回一个变量?或者说是一块地址,让你去赋值?

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

与龙共舞 回答时间:2018-6-28 13:40:21
本帖最后由 与龙共舞 于 2018-6-28 13:42 编辑

跪谢  搞C这么久 还不知道这个知识 太犀利了
  1 #include<stdio.h>
  2 int A,B,C;
  3 #define Pick_0 A
  4 #define Pick_1 B        
  5 //#define Pick(a)   (a)?Pick_1ick_0   ------这是不行的!
  6 #define Pick(a)      Pick_##a  ------------------成功!
  7       void main()
  8       {
  9        printf("%d\t%d\t%d\n",A,B,C);
10        Pick(1)=1;
11
12        printf("%d\t%d\t%d\n",A,B,C);
13       }
14
我真的是第一次看到这个做法  转义 的             #define Pick(a)      Pick_##a  可以
             #define Pick(a)      Pick_(a)不行   
zhao.zhao 回答时间:2018-6-28 20:43:27

这个答案符合楼主的意思,赞同
与龙共舞 回答时间:2018-6-29 09:11:51

可以的  你这是正经方法
  1 #include<stdio.h>
  2 int A,B,C;
  3 //#define Pick(a)   * ( (a)?(&A)&B))-----OK
  4 #define Pick(a)    (a)?(A)B)--------------FAIL
  5       void main()
  6       {
  7        printf("%d\t%d\t%d\n",A,B,C);
  8        Pick(1)=1;
  9
10        printf("%d\t%d\t%d\n",A,B,C);
11       }
12

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3 结帖奖励

查看全部评分

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版