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

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

[复制链接]
GKoSon 提问时间: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个回答
随风飘扬 回答时间: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

查看全部评分

GKoSon 回答时间: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

这个答案符合楼主的意思,赞同
GKoSon 回答时间: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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版