首页 > 编程语言 >条件编译、多文件编程、结构体

条件编译、多文件编程、结构体

时间:2024-10-30 19:33:00浏览次数:1  
标签:语句 文件 头文件 变量 int 编程 编译 结构

条件编译

条件编译可以在编译的时候从几组语句中选择一组编译而忽略其他组,

#ifdef/#ifndef...
#else...
#endif

这个结构可以根据一个宏名称是否被定义过从两组语句中选择一组编译,最开始的预处理指令都应该从两个里选择一个,不论选择哪一个都应该在后面写一个宏名称。如果最开始的预处理指令选择#ifdef就表示后面的宏名称被定义的时候编译前一组语句否则编译后一组语句,如果最开始的预处理指令选择#ifndef效果和#ifdef刚好相反。

练习:编写点菜程序,要求能编译成两个不同的版本

1.代表龙虾

2.代表小鸡炖蘑菇

(有、没有、真没有)

/*
 *
 *点菜程序
 *
 * */
#include<stdio.h>
int main (){
	int order = 0;
	printf("请点菜:");
	scanf("%d",&order);
#ifdef 		ZHAOBENSHAN
	if (order == 2){
		printf("真没有\n");
	}
	else {
		printf("没有\n");
	}
#else
	if (order == 2){
		printf("没有\n");
	}
	else {
		printf("有\n");
	}
#endif
	return 0;
}

#if...
#elif(任意多次)...
#else...
#endif

以上结构可以实现条件编译的效果,它可以根据任意逻辑表达式从多组语句中选择一组编译。

if和#elif后都需要写逻辑表达式,这些逻辑表达式里可以使用任意逻辑操作符,这些逻辑表达式的作用和if分支里逻辑表达式的作用一样。

多文件编程

多文件编程的时候任何一个函数只能属于一个文件,一个文件里可以包含多个函数,多文件编程基本步骤:

1.把所有函数分散在多个不同的源文件里(主函数通常单独占一个文件)。

2.为每个源文件编写配对的以.h作为拓展名的头文件(主函数所在的源文件不需要配对的头文件)只要不分配内存的内容都可以写在头文件里,头文件里至少应该包含配对源文件里的所有函数声明。

3.修改所有源文件,在源文件里使用#include预处理指令包含必要的头文件(配对头文件是必要头文件,如果源文件里使用了某个头文件里声明的函数则这个头文件也是必要头文件)。

编译多文件程序的时候需要在gcc命令后列出所有源文件的路径。

Makefile

可以把多文件程序的编译过程记录在Makefile文件里,然后使用make工具根据Makefile文件的内容进行编译。

Makefile里每个编译命令前都应该用tab键而不是空格键。

头文件内容如果应该被包含在条件编译预处理指令中间,这样可以避免编译的时候哦反复多次重复编译同一个头文件的内容。第一个预处理指令必须是#ifndef,头文件使用的宏名称应该根据文件名称变化得到。

Makefile简单书写如下,

a.out : main.o func.o
		gcc main.o func.o
main.o : main.c
		gcc -c main.c
func.c : func.c
		gcc -c func.c


练习:编写函数从键盘得到一个整数并把这个整数传递给调用函数,用多文件编程实现。

/*主函数*/
#include<stdio.h>
#include "11add.h"
int main (){
	int num = 0,num1 = 0;
	printf("请输入两个数字:");
	scanf("%d%d",&num,&num1);
	printf("%d\n",add(num,num1));
	return 0;
}

/*加法函数*/
#include"11add.h"
int add (int num ,int num1){
	return num + num1;
}

/*加法函数头文件*/
#ifndef 	_ADD_H_
#define		_ADD_H_
int add(int,int);
#endif 		//_ADD_H_

全局变量补充

如果希望从一个源文件里使用另外一个源文件里声明的全局变量就需要使用extern关键字再次声明这个全局变量,这种使用extern关键字声明的语句不会分配内存,他们通常写在头文件里。不可以跨文件使用静态全局变量。

结构体

C语言里可以在一个存储区里记录多个数字,这种存储区的类型叫结构体类型;这种类型需要创建出来后才能使用,结构体类型的存储区里包含多个子存储区,每个子存储区可以用来存放一个数字,结构体的不同子存储区也可以是结构体类型的存储区。

结构体声明语句可以用来创建结构体类型,声明结构体类型的时候需要使用struct关键字。结构体声明语句里包含多个变量声明语句,这些变量叫做结构体的成员变量,每个成员变量代表一个子存储区。成员变量的声明语句不会分配内存,它们只是用来表示子存储区的类型名称(成员变量不可以初始化),C语言里结构体不可以包含函数,结构体声明语句可以写在任何地方,包括头文件里。

可以把结构体作为类型声明变量,这种变量叫做结构体变量。把结构体作为类型的时候需要把struct关键字和结构体名称一起作为类型名称使用。结构体变量分配了内存,他们可以用来记录数字。

typedef

typedef关键字可以用来给一个数据类型起别名,别名可以用来代替原有的类型名称,通常会给结构体类型起别名,可以把声明结构体的语句和起别名的语句合并成一条语句。这个时候可以省略结构体本省的名称。

声明结构体变量的时候也应该进行初始化,结构体变量初始化的方法和数组的初始化方法一样,结构体变量通常不能作为整体使用,一般一次只是用其中某个子存储区。以下写法可以用来表示结构体的某个子存储区。

/*
 *
 *结构体
 *
 * */
#include<stdio.h>
/*struct person{
		int age;
		float height;
		char name[10];
};
typedef struct person sperson;*/

typedef struct /*person*/{
	int age;
	float height;
	char name[10];
}sperson;
int main (){
	//struct person prsn; 		//结构体变量声明语句
	//sperson prsn1 = {18,48.3f,"abc"};
	printf("年龄是:%d\n",prsn1.age);
	printf("身高是:%g\n",prsn1.height);
	printf("名字是:%s\n",prsn1.name);
	return 0;
}

prsn.age

其中prsn是结构体变量名称,age是某个成员变量的名称。同类型结构体变量之间可以直接赋值,结构体指针用来记录结构体存储区的地址,以下写法可以通过结构体指针表示结构体的子存储区

p_person- >age

其中p_person是结构体指针,age是成员变量名称 。

标签:语句,文件,头文件,变量,int,编程,编译,结构
From: https://www.cnblogs.com/GQH1000/p/18516454

相关文章

  • rsync和inotify-tools实现文件实时同步
    rsync和inotify-tools实现文件实时同步一、环境准备服务器设置确定一台源服务器(假设为ServerA)和多台目标服务器(假设为ServerB、ServerC等),确保它们之间网络连通,并且能够互相通过SSH访问。在每台服务器上安装inotify-tools和rsync软件包。在CentOS系统中,可......
  • Java使用apache.commons.io框架下的FileUtils类实现文件的写入、读取、复制、删除
    ApacheCommonsIO是Apache开源基金组织提供的一组有关IO(Input/Output)操作的小框架,它是ApacheCommons项目的一部分,专注于提供简单易用的API,用于处理输入和输出操作。ApacheCommonsIO是一个功能强大的JavaIO工具库,提供了丰富的API来简化文件和流的操作。通过使用......
  • 16.1 并发编程基础——Java多线程
    16.1并发编程基础——Java多线程16.1.1 引言Java语言的一个重要特点是内在支持多线程的程序设计。多线程的程序设计具有广泛的应用。线程的概念来源于操作系统进程的概念。进程是一个程序关于某个数据集的一次运行。也就是说,进程是运行中的程序,是程序的一次运行活动。线......
  • 真香!Python十大文件操作整理,收藏起来以后有用!!
      精品专题:01.《C语言从不挂科到高绩点》课程详细笔记https://blog.csdn.net/yueyehuguang/category_12753294.html?spm=1001.2014.3001.548202.《SpringBoot详细教程》课程详细笔记https://blog.csdn.net/yueyehuguang/category_12789841.html?spm=1001.2014.3001.5482......
  • InnoDB 存储引擎<四>磁盘文件一
    目录磁盘文件系统表空间-SystemTablespace 独⽴表空间-File-Per-TableTablespace  撤销表空间-UndoTablespaces磁盘文件1.InnoDB存储引擎包含哪些磁盘⽂件?分析过程:从官⽹给出的InnoDB架构图中可以找到答案InnoDB存储引擎架构链接解答问题:......
  • eigen3 编译报错
    错误信息:/usr/include/eigen3/unsupported/Eigen/CXX11/src/util/EmulateArray.h:254:30:error:redeclaredwith1templateparameter254|template<typenameT>structarray_size;/usr/include/eigen3/unsupported/Eigen/CXX11/src/util/EmulateArray.h:255:41......
  • js0smt.dll 文件丢失?高效修复 js0smt.dll 缺失步骤
    当遇到js0smt.dll文件丢失的问题时,以下是一些高效的修复步骤,可以帮助您恢复文件的正常使用:一、确认文件丢失并重启计算机观察错误提示:当您尝试启动某个程序或游戏时,如果系统提示“找不到js0smt.dll”或“js0smt.dll缺失”,则说明该文件可能已丢失或损坏。重启计算机:......
  • Beyond Compare主进程因7zxa.dll报错崩溃,解决Beyond Compare中7zxa.dll文件丢失或损坏
    在使用BeyondCompare这款强大的文件和文件夹比较工具时,用户可能会遇到主进程因7zxa.dll文件报错而崩溃的问题。7zxa.dll是一个动态链接库文件,虽然它原本是为7-Zip压缩软件设计的,但在某些情况下,它可能会与BeyondCompare产生关联并导致错误。本文将详细介绍如何解决BeyondComp......
  • 批量提取mp4文件中的音频
    !/bin/bash检查是否传入输入目录参数if[-z"$1"];thenecho"Usage:$0<input_dir>[output_dir]"exit1fi获取输入和输出目录INPUT_DIR="$1"OUTPUT_DIR="${2:-./mp3_files}"#如果未指定output_dir,则默认为当前目录下的mp3_files检查输入目录是否存在if[......
  • Ansible 的主机清单和配置文件
    一.简介在使用Ansible来批量管理主机的时候通常我们需要先定义要管理哪些主机或者主机组,而这个用于管理主机与主机组的文件就叫做Inventory,也叫主机清单。该文件默认位于/etc/ansible/hosts。当然我们也可以通过修改ansible配置文件的Inventory配置项来修改默认inven......