2 toughcookie1 toughcookie1 于 2016.09.11 10:25 提问

求问为什么要用两个宏,

_STR(x)和_VAL(x)用一个不行吗?为什么用了_VAL(x)还要用_STR(x)代替?图片说明

2个回答

hijack00
hijack00   Rxr 2016.09.11 11:44
已采纳

因为存在多次宏替换(__LINE__也是宏),定义一个宏与定义两个宏效果是不一样的。
如果想理解底层宏替换的细节,只要在gcc编译选项中增加-E,即只进行预处理,这样就可以看到预处理(宏替换)之后的结果。

可以试试看只定义一个宏和定义两个宏得到的结果有什么不同

qq_35553864
qq_35553864   2016.09.11 14:56

你试试只用一个宏就知道了。LINE也是个宏,通过一个中间宏,LINE才能来得及展开

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
为什么宏定义总是要使用do-while语句呢?
在阅读linux内核代码的过程中,经常会发现宏定义中使用了do-while语句。有时候觉得这种do-while语句显得有点多余?干嘛非得使用它把函数块包裹起来?像下面的 #define MARCO_FUN1() do{\                                                Function();                            
C/C++语言为什么要有宏?
不知道大家有没有考虑过这样一个问题,除了C/C++语言之外,似乎很少在其他语言中看到类似宏定义的设计。 我个人的理解如下1.运行速度问题 大家都知道,调用函数是有开销的,虽然在现代的计算机上,这种性能损耗可能微不足道,但是在C语言发明的那个年代,可能算是一笔不小的开销,特别是在循环中调用函数时。 所以大家可以看到C语言标准库定义了很多模拟函数的宏,这是一种典型的空间换时间的做法,这些宏在编译时
9.2 输入两个整数,求它们相除的余数。用带参的宏来实现,编程序。
9.2 输入两个整数,求它们相除的余数。用带参的宏来实现,编程序。 #include//9.2 输入两个整数,求它们相除的余数。用带参的宏来实现,编程序。 #define Y(a,b) a%b int main() { int a,b; printf("Input a:"); scanf("%d",&a); fflush(stdin); printf("Input b:"); sc
定义两个带参的宏,一个用来求area, 另一个宏用来求S
题目描述 三角形面积=SQRT(S*(S-a)*(S-b)*(S-c)) 其中S=(a+b+c)/2,a、b、c为三角形的三边。 定义两个带参的宏,一个用来求area, 另一个宏用来求S。 写程序,在程序中用带实参的宏名来求面积area。 输入 a b c三角形的三条边,可以是小数。 输出 三角形面积,保留3位小数 样例输入 3 4 5 样例输出 6.000
输入两个整数,求他们相除的余数。用带参的宏来实现,编程序。
题目描述 输入两个整数,求他们相除的余数。用带参的宏来实现,编程序。 输入 a b两个数 输出 a/b的余数 样例输入 3 2 样例输出 1 #include #define s(a,b) a%b int main() {     int x,y;     scanf("%d%d",&x,&y);     pri
为什么要用spring?
从一年前的增删查改,到现在的自学框架。其中的艰辛很多,但是收获更多。其中也只是两个字就能说明白了——坚持。为何要用spring,学之前,应思考这个问题,然后由这个问题,引出spring框架包含的特征。这些在spring官网的官方文档。都有说明,也都讲的很明白。点击打开链接然后要做的就是看着文档尝试搭建spring框架了。...
用带参数的宏定义,通过海伦公式求三角形的面积
要求: 海伦公式:s=sqrt(p*(p-a)*(p-b*)(p-c)),其中p=(a+b+c)/2,a,b,c为三角形的三个边。定义两个带参数的宏,一个用来求p,另一个用来求s 题目分析: 首先,题目要求是通过输入三角形的三条边,输出三角形的面积。因为不是任意的三条边都可以构成三角形,所以应该先对输入的三条边进行判断,如果满足任意两条边的和大于第三边,则进行计算;如果不满足,则输出错误。然
为什么经常用const来代替宏
常量:是一种标识符,值在运行期间不变。C语言用#define,C++也可以用,它还可以用const来表示常量。 常量可以使程序的可读性变强,想一下如程序中全是变量字符串,会不会很麻烦呢?我们写程序会相当复杂。 宏和const具体就不介绍怎么使用了。注意的是,宏后面没有分号,const有的。const和宏的比较:1.const是有类型的,而宏是没有的。它等于是给某个数字或者字符串用特定的名字来表示
用宏定义实现 得到两个数的最值
使用两种宏定义的方法实现 得到两个数的最小值和最值 方法一: 利用三重条件运算符 #include <stdio.h> #define MIN(A,B) ( (A) > (B) ? (B) : (A) ) #define MAX(A,B) ( (A) > (B) ? (A) : (B) ) int main(void) { printf("%d\n",MIN(12,334));
三角形的面积为 area=根号下s(s−a)(s−b)(s−c) 其中s=(a+b+c)/2,abc 为三角形的三边。定义两个带参数的宏来求s,area
三角形的面积为 area=根号下:s·(s−a)·(s−b)·(s−c)。其中,s=(a+b+c)/2,a,b,c 为三角形的三边