C学习笔记(1)-结构体、预处理与多文件结构程序设计
一、结构体的定义与使用
#include <stdio.h>
//定义结构体(类似模板)
typedef struct
{
char name[50];
int age;
char address[100];
} nvgui;
void main()
{
nvgui niexiaoqian={"聂小倩",18,"兰若寺"};
nvgui b={"千年树精",100,"大树"};
printf("聂小倩的信息:n姓名:%sn年龄:%dn",niexiaoqian.name,niexiaoqian.age);
}
二、其它概念
1.变量必须放在其它语句之前
2.调用函数之前需要先进行函数声明:
就是告诉编译器,这个函数已经存在,和这个函数具体是什么格式的,名称是什么,返回值是什么,数据个数和类型分别是什么,以后在用到这个函数的时候编译器就按照这个声明的格式来检查函数的使用是否正确
就是告诉编译器函数的类型,名称,使用的参数的类型。
3.以#开始的为预编译指令
#include |
意思原样展开 |
---|---|
#include |
带<>为系统自带的,在库文件中找 |
带“”在工程文件下找 |
|
#ifndef |
(if not define) #ifndef A如果没有定义A就执行下面的语句 |
#define |
#define MAX_SIZE 10 定义(定义一个字符常量)程序中所有的MAX_SIZE都被10代替(可以让10这个常量更有意义) |
#endif |
与#ifndef配对,开始,结束 |
所有头文件必须包含下面三句话(模版):
#ifndef 头文件名_H
#define 头文件名_H
…
…
函数声明或者宏定义、全局变量、结构体类型
#endif
三、多文件结构程序设计(重点)
大学学了一年的C都没整明白几个.c文件是怎样关联到一块的,我在一个.c文件中写了一个函数,怎么在另外一个.c文件中调用,也就是什么是多文件结构设计。下面我们一步一步实现这个多文件的调用问题:
1.咱们新建一个工程命名为myFirstC,如下图:
2.新建一个.c文件为main.c为程序的入口,再新建一个add.c,这里面实现一个两个数相加的小函数
3.建议一个头文件add.h,咱们先完成这个里面的代码:如下
#ifndef ADD_H
#define ADD_H
int add(int a,int b);
#endif
代码说明请参考上边讲的预处理的介绍。
接着实现add.c的代码
#include <stdio.h>
#include "add.h"
int add(int a,int b)
{
printf("我是来自add.cn");
return a+b;
}
这里说下为什么要引入自己的头文件,主要是因为如果存在多个相互调用的子函数,那就需要进行函数声明,这时需要引入自己的头文件就行了,如果头文件没有包含,需要补写函数声明。
最后就是main.c文件的实现了:
#include<stdio.h>
#include"add.h"
main()
{
int a=5,b=6;
printf("a+b=%dn",add(a,b));
}
编译一下,没有任何错误,运行结果为:
最后看下文件结构:
呵呵,简单吧,这就是c语言的多文件结构程序
- Log4Net 生成多个文件、文件名累加解决方法
- 【C#|.NET】lock(this)其实是个坑
- SpringMVC过程中@RequestBody接收Json的问题 总是报415
- 如何开发自己的搜索帝国之安装ik分词器
- 如何开发自己的搜索帝国之ES图形化Kibana安装与使用
- 高可用高性能分布式文件系统FastDFS进阶keepalived+nginx对多tracker进行高可用热备
- 分布式文件系统FastDFS如何做到高可用
- 分布式监控系统Zabbix3.2添加自动发现磁盘IO并注册监控
- SpringMVC提交数据遭遇基础类型和日期类型报400错误解决方法
- 分布式监控系统Zabbix3.2对数据库的连接数预警
- 分布式监控系统Zabbix3.2监控数据库的连接数
- 分布式监控系统Zabbix3.2给异常添加邮件报警
- 分布式监控系统Zabbix3.2跳坑指南
- 一图看懂java内存模型
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 十一、详解面向对象
- 十二、面向对象实战之封装拖拽对象
- 数组reduce方法的高级用法
- 十七、详解 ES6 Modules
- 超干货!为了让你彻底弄懂 MySQL 事务日志,我通宵肝出了这份图解!
- 什么情况下不能使用最坏情况评估算法的复杂度?
- Python运算符
- kubeadm高可用集群意外删除一mater节点,重新加入失败
- Chevereto——简介及安装
- Typecho开启伪静态并隐藏index.php
- Prism代码高亮Pjax重载函数
- Qt示例-AnalogClock-自定义窗体-使用QPainter的转换和缩放特性简化绘图
- 2019-12-27-traefik
- 2019-12-05-eck-qustion
- 聊聊dubbo-go的ConsumerSignFilter