开发者社区> 流楚丶格念> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

C语言学习——预处理命名

简介: C语言学习——预处理命名
+关注继续查看

一、宏定义


编译:对源程序进行词法、语法分析,生成代码,优化等。


作用:在编译之前,对源程序中的特殊命令做一些处理,生成扩展C源程序


种类:


宏定义 #define


文件包含 #include


条件编译 #if #else #endif等


格式:


“#”开头


占单独书写行


语句尾不加分号


image


2)C语言允许宏带有参数。在宏定义中的参数称为“形式参数”,在宏调用中的参数称为“实际参数”,这点和函数有些类似。


对带参数的宏,在展开过程中不仅要进行字符串替换,还要用实参去替换形参。


带参宏定义的一般形式为:


#define 宏名(形参列表) 字符串


#define M(y) yy+3y // 宏定义


printf(“S=%d\n”, M(5));


(3)在带参宏定义中,不会为形式参数分配内存,因此不必指明数据类型。而在宏调用中,实参包含了具体的数据,要用它们去替换形参,因此实参必须要指明数据类型。


这一点和函数是不同的:在函数中,形参和实参是两个不同的变量,都有自己的作用域,调用时要把实参的值传递给形参;而在带参数的宏中,只是符号的替换,不存在值传递的问题。


#include <stdio.h>
#define SQ(y) (y)*(y)
int main()
{
    int a, sq;
    printf("input a number: ");
    scanf_s("%d", &a);
    sq = SQ(a + 1);
    printf("sq=%d\n", sq);
    return 0;
}


image


(4) 在宏定义中,字符串内的形参通常要用括号括起来以避免出错。例如上面的宏定义中 (y)*(y) 表达式的 y 都用括号括起来,因此结果是正确的。如果去掉括号,把程序改为以下形式:


#include <stdio.h>
#define SQ(y) y*y

int main()
{
    int a, sq;
    printf("input a number: ");
    scanf_s("%d", &a);
    sq = SQ(a + 1);
    printf("sq=%d\n", sq);

    return 0;
}


image


二、“文件包含”处理


image


三、条件编译


条件编译是指预处理器根据条件编译指令,有条件地选择源程序代码中的一部分代码作为输出,送给编译器进行编译。主要是为了有选择性地执行相应操作,防止宏替换内容(如文件等)的重复包含。常见的条件编译指令如下表 所示。


image


image


image


image


image

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
C语言学习——位运算
C语言学习——位运算
14 0
C语言学习——数组
C语言学习——数组
8 0
【c语言】学习笔记1
c语言可以说是高级计算机语言之母。之前学校有开c语言课程,但是几乎没有听过。期末考也是突击两小时。写java也有一年多了,总感觉只是停在用的基础上,没有办法去深究它到底是怎么样组织数据的。所以在一直想重新来一遍C语言。
887 0
【c语言】学习笔记【1】
c语言可以说是高级计算机语言之母。之前学校有开c语言课程,但是几乎没有听过。期末考也是突击两小时。写java也有一年多了,总感觉只是停在用的基础上,没有办法去深究它到底是怎么样组织数据的。所以在一直想重新来一遍C语言。
1295 0
+关注
流楚丶格念
csdn平台优质创作者,51cto TOP博主,360图书馆科技博主,燕山大学目前大三在读,日拱一卒,功不唐捐,加油!!!
1010
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载