it编程 > 编程语言 > C/C++

C语言进阶(预处理命令详解)

7人参与 2025-07-25 C/C++

1.宏定义

1.1不带参宏

#define  pi   3.14

变量名尽量大写

1.2带参宏

定义方式:

#define  max(x, y)     x > y ? x : y

下面的代码运行结果为15,显然是错误的。

   #include <stdio.h>
   #define jisuan(x, y, z)    x * y + z
   int main(void)
   {
       int a = 0;                                                                                                                                                 
       a = jisuan(1 + 2,2 * 3,3 - 1);
       printf("%d",a);
   }     

给变量带上括号,运行结果是,正确做法如下:运行结果为20。因此尽量给定义添加括号。避免计算错误。

   #include <stdio.h>
   #define jisuan(x, y, z)    ((x) * (y) + (z))
   int main(void)
   {
       int a = 0;                                                                                                                                                 
       a = jisuan(1 + 2,2 * 3,3 - 1);
       printf("%d",a);
   }     

带参宏和函数的区别:

带参宏函数
带参宏没有参数类型、返回值、函数类型 相关概念函数有参数类型、函数类型、返回值相关 概念
带参宏只是代码的替换,没有调用传参过 程函数有调用、传参过程
带参宏是在程序编译时展开,代码体积增 大函数是在程序运行过程中加载,代码体积 不会增大
带参宏没有传参过程,执行效率高函数有传参过程,需要调用、传参产生资 源开销
简单的代码想要封装模块,优先带参宏需要严谨的代码逻辑,多行代码,考虑使 用函数

2.头文件的包含

#include <stdio.h>
#include <string.h>
#include <math.h>
#include "head.h"

#include 包含一个文件,文件会在预处理编译时展开。

<>:在系统目录下查找该头文件。

"":在当前目录下查找该头文件,如果找不到再到系统目录下查找头文件。

2.1头文件中的内容

1.构造数据类型的定义

2.全局变量的声明

3.全局函数的声明

4.宏定义

2.2工程结构

main.c中负责主函数编写

这么说可能有些不太好理解,我们来举个例子吧:

我们先创建一个工程文件夹jisuan来进行输入两个数字的四则运算:

再在里面创建jia.c jia.h jian.c jian.h cheng.c cheng.h chu.c chu.h main.c,一个.c的功能文件必须对应一个.h的头文件声明用来方便主文件的调用!这里main.c不需要头文件。因为这里存放主函数。

创建好后分别对jia.cjian.c cheng.c chu.c函数进行编写。

   #include<stdio.h>
   float jia(float x , float y)                                                                                                                                                     
         {
             return x + y;
         }
  #include <stdio.h>
   float jian(float x , float y)
         {
             return x - y;                                                                                                                                                          
         }
  #include<stdio.h>                                                                                                                                                                
   float cheng(float x , float y)
         {
             return x * y;
         }
   #include<stdio.h>
   extern float chu(float x , float y)                                                                                                                                              
         {
             return x / y;
         }

接下来依次编写他们的头文件:

 extern float jia(float x ,float y); 

jian.h

 extern float jian(float x ,float y); 
 extern float cheng(float x ,float y); 
 extern float chu(float x ,float y); 

最后我们进行主函数的编写:这里要注意一定要用#include"函数功能.h"来声明定义的变量

   #include<stdio.h>
   #include"jia.h"
   #include"jian.h"
   #include"cheng.h"
   #include"chu.h"
   
   int main(void)
   {
       float r1 = 0;
      float r2 = 0;
      float r3 = 0;
      float r4 = 0;
      float a = 0;
      float b = 0;
      scanf("%f %f",&a,&b);
      r1 = jia(a,b);
      r2 = jian(a,b);
      r3 = cheng(a,b);
      r4 = chu(a,b);
      printf("jia = %f\n",r1);
      printf("jian = %f\n",r2);
      printf("cheng = %f\n",r3);
      printf("chu = %f\n",r4);
      return 0;
  }  

ok,编写工作完成,我们来对.c文件进行编译:

编译完成后就会出现一个可执行文件main

我们试着运行一下:

输入12和45,得出计算结果。

这里,我在想这不是跟我前一篇写的函数里extern外部声明一样的嘛,只不过通过#include""展开函数声明而已。但是在未来的项目中撰写每个功能代码和主函数的不是同一个人,为了方便撰写主函数的人调用,采用这样的方法是不错的选择。

3.条件编译

关键字功能描述
#if如果条件为真则编译后续代码块
#elif若前面的#if或#elif条件不成立,并且该条件成立,则编译该部分的后续代码块
#else若前面的#if和#elif都不成立,则编译该部分代码块
#endif结束一个条件编译块,必须要与#if,#ifdef,#ifndef联用
#ifdef若某个宏被定义,则使用该部分代码
#ifndef若某个宏没被定义,则使用该部分代码
#if 1
编译此部分
#elif 
不编译该部分
#else
#if 0
不编译该部分
#elif 1
编译该部分
#else
test
#if 0
不编译该部分
#elif 0
不编译该部分
#else
编译该部分
#if 1
编译该部分
#endif  结束此条件编译
#if 0
不编译该部分
#endif  结束此条件编译

#ifdef与#ifndef一般在项目测试中使用,可以在编译时于外部定义或不定义某个宏,以此来调用代码。

  #include <stdio.h>
  #define jisuan(x, y, z)    ((x) * (y) + (z))
  int main(void)
  {
      #ifdef  test
      printf("测试\n");
      #endif
      #ifdef  yingyong
      printf("应用\n");
      #endif
      return 0;
  } 

如上述代码,对其编译gcc -d test l.c -o l 在编译的时候在外部定义了test,则输出测试

如果在外部定义yingyong 则输出应用。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

您想发表意见!!点此发布评论

推荐阅读

一文详解C++中打开文件的多种方式及相关流类

07-25

新版本Qt Creator安装配置的实现步骤

07-25

C++项目中使用.dll 和.def 文件的操作指南

07-25

QT6.5.3安装教程(使用国内源)

07-25

C++中detach的作用、使用场景及注意事项

07-23

C++11中的lambda表达式与包装器

07-18

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论