与龙共舞 发表于 2018-6-28 10:41:37

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

本帖最后由 与龙共舞 于 2018-7-3 18:04 编辑

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


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

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

yu0405jie 发表于 2018-6-28 15:59:16

int A, B;

#define PICK(c) *((c)?(&A):(&B))

Mandelbrot_Set 发表于 2018-6-28 11:47:39

int a,b;
#define pick_1a
#define pick_2b
#define pick(x) pick_##x

发表于 2018-6-28 11:05:37

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

stm1024 发表于 2018-6-28 11:05:58

绝对地址赋值,如何?

发表于 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 编辑

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

与龙共舞 发表于 2018-6-28 13:40:21

本帖最后由 与龙共舞 于 2018-6-28 13:42 编辑

Mandelbrot_Set 发表于 2018-6-28 11:47

跪谢搞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_1:Pick_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

yu0405jie 发表于 2018-6-28 15:59


这个答案符合楼主的意思,赞同:victory:

与龙共舞 发表于 2018-6-29 09:11:51

yu0405jie 发表于 2018-6-28 15:59


可以的你这是正经方法
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]
查看完整版本: (已解决)C编程宏定义函数