当前位置: 首页 > news >正文

C语言基础(十)

编译预处理命令:

预编译命令在C语言中用于在编译前进行一些特定的处理和控制,帮助程序员更灵活地管理源代码和控制编译过程。

C语言常用的预编译命令:

#include:用于包含头文件,将另一个文件的内容插入到当前文件中。

#include 可以将头文件中的声明、定义等内容导入到当前源文件中,从而使得程序中可以使用头文件中定义的函数、变量等。
使用尖括号(< >)包含文件用于包含系统或全局范围的头文件,这些头文件通常存储在系统目录的标准库中。

使用双引号(" ")包含文件用于包含用户定义的头文件,这些头文件通常在当前项目的目录中或者特定的包含路径中。

......................................................................................................................................................... 

#define和#undef:用于定义和取消宏。 编译时,预处理器会将程序中出现的宏名替换为宏定义中的内容。

#ifdef、#ifndef、#else和#endif:用于条件编译,根据条件选择性地包含代码。

#ifdef 指令用于判断一个宏是否已经定义,如果定义了,则编译后面的代码段。

语法为:

#ifdef MACRO_NAME
    // Code to be compiled if MACRO_NAME is defined
#endif

#ifndef 和 #else 是 C 语言中的预处理指令,用于条件编译。通常与 #ifdef 一起使用,可以让程序根据宏的定义情况选择性地编译代码段。

#ifndef:#ifndef 指令和 #ifdef 相反,用于判断一个宏是否未定义,如果未定义,则编译下面的代码段。

语法为:

#ifndef MACRO_NAME
    // Code to be compiled if MACRO_NAME is not defined
#endif

当宏 MACRO_NAME 未被定义时,编译器会编译 #ifndef 到 #endif 之间的代码。

#else:#else 指令用于在 #ifdef 或 #ifndef 的条件不成立时执行备选代码段。

语法为:

#ifdef MACRO_NAME
    // Code to be compiled if MACRO_NAME is defined
#else
    // Code to be compiled if MACRO_NAME is not defined
#endif

如果 MACRO_NAME 宏已经定义,则编译 #ifdef 到 #else 之间的代码;否则编译 #else 到 #endif 之间的代码。
通过结合使用 #ifndef 和 #else 可以更灵活地根据宏的定义情况选择性地编译不同的代码段,实现条件编译的效果。

.......................................................................................................................................................... 

#pragma:用于向编译器发送特定的指令。

#error:用于生成编译错误信息。

#line:用于修改行号和文件名信息。

#if、#elif和#else:用条件编译,根据条件选择性地包含代码。

#warning:用于生成编译警告信息。

#pragma pack:用于在编译时设置内存对齐方式。通过 #pragma pack(n) 可以指定结构体、联合体或类的成员变量按照 n 字节对齐。该指令可以有效减小结构体大小,节省内存空间,但是对齐方式不当可能导致性能问题或者其他错误。通常在需要与外部系统或硬件进行数据交互时使用。

#pragma warning:用于控制编译警告的输出。

#LINE、FILE、DATE、__TIME__等预定义宏:用于获取编译时的行号、文件名、日期、时间等信息。

1、宏定义:

测试代码:

//无参数的宏定义:用一个标识符(宏名)来代表一个字符串(宏体)。
//在预处理阶段,预处理器会将所有的宏名替换为它们对应的宏体。
//格式:#define 宏名 替换文本//带参数的宏定义: 有参数的宏定义允许宏像函数一样接受参数,并在宏体内使用这些参数。
//格式:#define 宏名(参数列表) 替换文本 #define VERSION "1.2.3" // 定义了一个无参数的宏,用于表示软件版本号  
//有参宏定义,宏的每个参数在宏定义体内用圆括号将参数括起来,宏体也用圆括号括起来,避免因运算符优先级导致的错误。 
#define MAX(a, b) ((a) > (b) ? (a) : (b)) // 定义了一个带参数的宏,用于计算两个数中的最大值  
#include <stdio.h>  // 引入标准输入输出库  int main() {    // 打印软件版本号  printf("当前软件版本:%s\n", VERSION);  // 使用MAX宏计算两个数的最大值  int x = 5, y = 10;    int max_value = MAX(x, y);  printf("x和y中较大的数是:%d\n", max_value); // 在printf中使用MAX宏  printf("x和3的较大数是:%d\n", MAX(x, 3)); return 0;    
}

运行结果如下:

....................................................................................................................................................... 

2、条件编译:

 创建一个funtion.h头文件:

#ifndef Fun
#define Fun// 声明void类型的函数sayHello,无参数
void sayHello();// 声明void类型的函数subtraction,有两个int类型的参数a和b
void subtraction(int a, int b);// 声明int类型的函数adds,无参数
int adds();// 声明char类型的函数addition,有两个int类型的参数a和b
char addition( int a,int b);// 声明单词统计函数
void countAndPrintWords(char str[]); #endif

创建一个 implementfunction.h头文件:

#ifndef FunIm 
#define FunIm 
#include <stdio.h>
#include <ctype.h>
#include <stdbool.h>// 实现funtion.h中声明的函数// 定义sayHello函数
void sayHello() {printf("Hello, World!\n");
}// 定义subtraction函数
void subtraction(int a, int b) {int multiplication = a * b;printf("The sum of %d and %d is %d\n", a, b, multiplication);
}// 定义adds函数
int adds() {return 10 + 20;
}// 定义addition函数
char addition(int a, int b) {return (char)a + b;
}//定义单词统计函数
void countAndPrintWords(char *str) {bool inWord = false;int wordCount = 0;// 循环遍历字符while (*str) {// 如果当前字符是字母或数字,表示在单词中if (isalnum(*str)) {if (!inWord) {inWord = true;wordCount++;printf("Word %d: ", wordCount);}printf("%c", *str);} else {if (inWord) {inWord = false;printf("\n");}}// 移动到下一个字符str++;}if (inWord) {printf("\n");}printf("Total words: %d\n", wordCount);
}
#endif

在main()函数中调用:

#include "funtion.h"//自定义的头文件用"" 
#include "implementfunction.h"//自定义的头文件用"" int main() {sayHello();subtraction(99, 5);int c = adds();char result = addition(81,5);printf("result = %d\n", result);  // 输出结果 printf("%c\n", result);printf("%d\n", c);  // 输出整数值char str[] = "This directive can help reduce the size of a structure, saving memory space, ""is important to be cautious as improper alignment may lead to performance issues ""or external systems or hardware.";countAndPrintWords(str);return 0;}

运行结果如下:

http://www.lryc.cn/news/430191.html

相关文章:

  • 人像比对-人证比对-人脸身份证比对-人脸身份证实名认证-人脸三要素对比-实人认证
  • Android 上下滑隐藏显示状态栏
  • USBCAN-II/II+使用方法以及qt操作介绍
  • 笔记-系统规划与管理师-案例题-2022年-IT服务部署实施
  • Kubernetes 清理资源常用的 Kubernetes 清理命
  • 【数据结构初阶】二叉树--基本概念
  • Pytorch添加自定义算子之(12)-开闭原则设计tensorrt和onnxruntime推理语义分割模型
  • 第二百零九节 Java格式 - Java数字格式类
  • LSI-9361阵列卡笔记
  • ArcGIS热点分析 (Getis-Ord Gi*)——基于地级市尺度的七普人口普查数据的热点与冷点分析
  • ASIACRYPT 2021
  • C#学习之路day1
  • 【安当产品应用案例100集】010-基于国密UKEY的信封加密应用案例
  • 扫码点餐系统小程序功能分析
  • 网络安全——基础知识记忆梳理
  • GitHub开源的轻量级文件服务器,可docker一键部署
  • Scratch编程深度探索:解锁递归与分治算法的奥秘
  • 使用docker compose一键部署 Portainer
  • js原生模板引擎
  • Java面试题———MySql篇③
  • ArcGis在线地图插件Maponline(好用版)
  • Chainlit接入DifyAI知识库接口快速实现自定义用户聊天界面
  • 《Python编程:从入门到实践》笔记(一)
  • Linux入门——06 基础IO
  • 未来城市的科技展望
  • DevOps安全性的重要性体现在哪?
  • 【tip】数量级大小
  • Java基础——自学习使用(static关键字)
  • 安装docker+docker远程连接
  • 2080. 邻接点