• 1900
    2020-02-01
    @Aaren Shan 的方法我早就想到了,是不行的,我后面试了如下方法,还是不行。
    #define MAX(a, b) { \
        __typeof(a) c = a; \
        __typeof(b) d = b; \
        c > d ? c : d; \
    }

    今天看了老师的答案,发现原来是要用括号括起来,就搞定了,即:
    #define MAX(a, b) ({ \
        __typeof(a) c = a; \
        __typeof(b) d = b; \
        c > d ? c : d; \
    })

    另外还有个疑问,最早我是这样写的
    #define MAX(a, b) (__typeof(a) c = a, __typeof(b) d = b, c > d ? c : d;)
    编译器报错,通不过,看报错原因是缺少“)”,但并没看懂这个报错原因,请胡老师解答。
    展开

    作者回复: 你把你的这个宏展开一下,代码会是 int c=a的内容,int d=b的内容,c>d...,在同一行中用逗号表达式链接了两个定义语句,这存在语法歧义,这是不对的。

     1
     2
  • 潮汐
    2020-02-03
    回复老师:
    #define MAX(a, b) ({ __typeof(a) __a = a, __b = b, __a > __b ? __a : __b })编译报错

    #define MAX(a, b) ({ __typeof(a) __a = a, __b = b; __a > __b ? __a : __b; })通过

    老师,c中,多行代码逻辑写成一行也是用;做分隔吗?

    还有一个是typeof前面两个下划线是什么用意?直接用typeof也可以。
    展开

    作者回复: 对的,也是用;做分隔。关于typeof这个,你可以认为,有两个下划线和没有的其实是两个东西,可两者的作用相同,而一般有两个下划线的更通用一些。

    
     1
  • 潮汐
    2020-02-02
    回复老师:
    #define MAX(a, b) ({ __typeof(a) __a = a, __b = b, __a > __b ? __a : __b })
    老师说可以写一行,请问这种写法的编译问题怎么处理,是哪里没写对吗,我能想到的就是,分隔语句,请老师指点

    作者回复: 你将这个宏展开,你看看是不是一句合法的C语言代码。你就明白了。^_^

    
    
  • 潮汐
    2020-02-02
    很多问题还是无法自己独立思考出来,需要参照下面留言和老师的答疑,才能发现,原来应该这样啊!
    针对宏命令的问题,看了老师的答疑,对,宏定义只是做简单的替换,有更深刻的理解了!

    作者回复: 学习是一个螺旋上升的过程,可以先跟着专栏走一遍,然后有时间的时候,再看第二遍,一般都会有新的认识。

    
    
  • 潮汐
    2020-02-02
    老师,按照@1900的写法,写成一行是不是一定行不通(编译不通过),如果宏替换内容包含多行的逻辑,是不是一定要换成多行的写法,用;结尾每一行?

    作者回复: 宏定义即使在实现的时候是多行,实际替换出来也是一行代码。;结尾的多个语句,也可以写在同一行。

    
    
  • 栾~龟虽寿!
    2020-02-02
    着急!还请大家答复我,上次课log那个bug,如何消除,我把helloworld后面加上一个参数,如"huu"就行了,但估计不是这个意思。

    作者回复: 其实只需要在将第二个printf语句改写成:printf(frm,##args);即可。

     5
    
我们在线,来聊聊吧