宏的实参不足编译器
① c语言 我是初学者
不用、、、
可以用来换行,如
#include<stdio.h>
#defineN
123456789
intmain(void)
{
printf("%d ",N);
return0;
}
/*
#defineN
123456789
//等价于#defineN123456789
*/
② C语言出现expected identifier or '('是什么意思
C语言出现expected identifier or '('是出现了编写错误,Error Message:Compilation failed with errors:q2/frac.c:32:1: expected identifier or '('
在这段程序中:void fr_rece(struct frac *a) {int g = gcd((*a).num, (*a).denom);(*a).num = ((*a).num / g);(*a).denom = ((*a).denom / g);if((*a).denom < 0){(*a).denom = -(*a).denom;}}
问题出在:{int s;s=a+b;return(s);}前面缺了函数首部,应为:int sum(int a,int b){int s;s=a+b;return(s);}
(2)宏的实参不足编译器扩展阅读:
C语言是一门通用计算机编程语言,广泛应用于底层开发。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
C语言一共只有32个关键字,9种控制语句,程序书写形式自由,区分大小写。把高级语言的基本结构和语句与低级语言的实用性结合起来。C 语言可以像汇编语言一样对位、字节和地址进行操作,而这三者是计算机最基本的工作单元。
尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。
参考资料:网络-c语言
③ C语言函数问题。带参数的宏ab这里是实参,下面mn也是实参,所以这里是下面的实参传给上面的实参吗
普通函数的声明,定义里用的叫形参,普通函数调用时,调用语句里的参数叫实参。
宏与它们不一样,宏在预编译期间,做的工作 是 替代 (字符替代,名字替代)。
#defind area(a,b) (PI * a * b) 里面的 PI 要被 前面PI 的 宏定义 替代成:
#defind area(a,b) ((asin(1) * 2) * a * b)
然后程序里的 s = area(m,n); 要用 area(a,b) 的 宏 替代,同时要把 实际参数 m,n代入,变成:
s = ((asin(1) * 2) * m * n);
上述工作完成后,编译器,再把 这个替代工作完成后的 源程序, 编译和链接成 可执行程序 .exe 文件。
④ C语言: 定义一个宏,比较a、b的大小,不要用大于、小于和IF运算符
代码如下:
#include "stdio.h"
void main()
{
float a, b ,c;
printf ("请输入三个数,会为你从大到小排列! ");
scanf("%f %f %f",&a,&b,&c);
if(a>b>c){printf("%f,%f,%f",a,b,c);}
else if(a>c&&c>b){printf("%f,%f,%f",a,c,b);}
else if(b>a&&a>c){printf("%f,%f,%f",b,a,c);}
else if(b>c&&c>a){printf("%f,%f,%f",b,c,a);}
else if(c>b&&b>a){printf("%f,%f,%f",c,b,a);}
else if(c>a&&a>b){printf("%f,%f,%f",c,a,b);}
//编译器不识别三个连续的符号运算,必须用且(&&)和或(||)he否(!)
}
(4)宏的实参不足编译器扩展阅读
C语言中宏定义的优点
方便程序的修改
使用简单宏定义可用宏代替一个在程序中经常使用的常量,这样在将该常量改变时,不用对整个程序进行修改,只修改宏定义的字符串即可,而且当常量比较长时, 可以用较短的有意义的标识符来写程序,这样更方便一些。
相对于==全局变量==两者的区别如下:
1、宏定义在编译期间即会使用并替换,而全局变量要到运行时才可以。
2、宏定义的只是一段字符,在编译的时候被替换到引用的位置。在运行中是没有宏定义的概念的。而变量在运行时要为其分配内存。
3、宏定义不可以被赋值,即其值一旦定义不可修改,而变量在运行过程中可以被修改。
4、宏定义只有在定义所在文件,或引用所在文件的其它文件中使用。 而全局变量可以在工程所有文件中使用,只要再使用前加一个声明就可以了。换句话说,宏定义不需要extern。
⑤ 关于C++宏定义问题
C++
宏定义
将一个
标识符
定义为一个字符串,
源程序
中的该标识符均以指定的字符串来代替。前面已经说过,
预处理命令
不同于一般C++语句。因此预处理命令后通常不加分号。这并不是说所有的预处理命令后都不能有分号出现。由于宏定义只是用宏名对一个字符串进行简单的替换,因此如果在宏定义命令后加了分号,将会连同分号一起进行置换。
定义带参数的宏时,宏体中与参数名相同的字符串适当地加上
圆括号
是十分重要的,这样能够避免
可能产生的错误。例如,对于宏定义:
#define
SQ(x)
x*x
当程序中出现下列语句:
m=SQ(a+b);
替换结果为:
m=a+b*a+b;
这可能不是我们期望的结果,如果需要下面的替换结果:
m=(a+b)*(a+b);
应将宏定义修改为:
#define
SQ(x)
(x)*(x)
对于带参的宏定义展开置换的方法是:在程序中如果有带
实参
的宏(如"SUB(2,3)"),则按"#define"命令行中指定的字符串从左到右进行置换。如果串中包含宏中的
形参
(如a、b),则将程序语句中相应的实参(可以是常量、变量或者表达式)代替形参,如果宏定义中的字符串中的字符不是参数字符(如a-b中的-号),则保留。这样就形成了置换的字符串。
⑥ 带参数的宏定义中,程序中引用宏定义的实参( d )。 A. 只能是常量 B. 只能是整型量 C. 只能是整型表达式 D.
选择D吧
因为前ABC三个都是可以输入作为实参的,宏都是直接替换,只要能替换,你管它是什么。