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

简介: C语言学习——预处理命名

一、宏定义


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


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


种类:


宏定义 #define


文件包含 #include


条件编译 #if #else #endif等


格式:


“#”开头


占单独书写行


语句尾不加分号



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;
}



(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;
}



二、“文件包含”处理



三、条件编译


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






相关文章
|
1月前
|
存储 自然语言处理 程序员
【C语言】文件的编译链接和预处理
【C语言】文件的编译链接和预处理
|
28天前
|
程序员 编译器 C语言
C语言中的预处理指令及其实际应用
C语言中的预处理指令及其实际应用
55 0
|
1月前
|
Linux C语言
【C语言】进程间通信之命名管道fifo
【C语言】进程间通信之命名管道fifo
13 0
|
1月前
|
编译器 C语言
C语言函数的学习
掌握函数的使用是学习C语言的关键一环,理解和应用这些基本的函数概念将使你能够更有效地利用C语言的强大功能。
13 0
|
3月前
|
存储 编译器 C语言
c语言学习历程【1】
c语言学习历程【1】
47 1
|
3月前
|
存储 程序员 Go
|
3月前
|
C语言
|
3月前
|
编译器 C语言
【C语言】:预处理详解
【C语言】:预处理详解
28 0
|
3月前
|
C语言
|
3月前
|
C语言