标C编程笔记day04 预处理、宏定义、条件编译、makefile、结构体使用
预处理:也就是包括须要的头文件,用#include<标准头文件>或#include "自己定义的头文件"
宏定义,如:#define PI 3.1415926
查看用宏定义的值替换宏名称,如:gcc -E test.c
带參数的宏:MAX(x,y) (x)>(y)?
((x):(y)) //用法与函数一样
宏运算:
#define PRINT(n) printf(#n"=%d",n) //#n 就是把传入的变量值作为字符串放在那里
#define MAX(type) type max_##type() //##n就是把变量的值作为函数名的一部分
#define MKID(n) i_##n //##n就是把变量的值作为变量名的一部分
C语言中提前定义的宏:
_LINE_ 当前正在编译的行号:%d
_FILE_ 正在编译的源程序名:%s
_DATE_ 编译程序的日期:%s
_TIME_ 编译程序的时间:%s
_STDC_ 推断编译器是否符合c标准,返回0或1:%d
条件编译:
#define TEST 1
#if TEST
//TEST为真时运行的代码
#endif
#ifndef ABC_H //假设没定义,就定义宏
#define ABC_H
//头文件定义
#endif
#ifdef ABC_H //假设定义了宏,取消定义
#undef ABC_H
#endif
推断: if defined(TEST) && !defined(ABC_H){ }
if……else……语法:#if …… #elif……#elif……#else……#endif
编译时。參数 -D 可随时定义宏。
声明使用外部变量的方法:exterm int speed;//speed为外部变量名
编写makefile文件批量编译的语法,演示样例:
main:main.o test.o test.h //冒号前台的是生成的目标。后面的是依赖的文件
gcc main.o test.o -o main //编译的详细语句
main.o:main.c
gcc -c main.c
test.o:test.c
gcc -c test.c
clean:
rm *.o
用法 。能够使用make 编译所有,也可使用make main.o 生成 main.o,使用make test.o 生成 test.o ,make clean 删除编译生成的.o文件。
结构体长度计算演示样例(自己主动补齐):
总长度为最长数据类型字节的整数倍。
struct student//总长28。是4的整数倍,所以终于大小为28字节
{
int ID;//4字节
char name[20];//数组 ,每一个字符1字节,共20字节
int age;//4字节
};
typedef struct//总长18字节,要是4的整数倍。大于10且是4的整数倍的数是20,所以终于大小为20字节
{
int ID;//4字节
char name[10];//数组 ,每一个字符1字节,共10字节
int age;//4字节
}student;
结构体变量的定义和使用:
struct student s; 或 struct student s={101,"zs",20};//定义时总体赋值
s.ID=101;//单个赋值
strcpy(s.name,"zs");//字符数组赋值
标C编程笔记day04 预处理、宏定义、条件编译、makefile、结构体使用的更多相关文章
- Linux中的两个经典宏定义:获取结构体成员地址,根据成员地址获得结构体地址;Linux中双向链表的经典实现。
倘若你查看过Linux Kernel的源码,那么你对 offsetof 和 container_of 这两个宏应该不陌生.这两个宏最初是极客写出的,后来在Linux内核中被推广使用. 1. offse ...
- C/C++编程笔记:C语言对齐问题【结构体、栈内存以及位域对齐】
引言 考虑下面的结构体定义: 假设这个结构体的成员在内存中是紧凑排列的,且c1的起始地址是0,则s的地址就是1,c2的地址是3,i的地址是4. 现在,我们编写一个简单的程序: 运行后输出: 为什么会这 ...
- C基础:关于预处理宏定义命令
为了程序的通用性,可以使用#define预处理宏定义命令,它的具体作用,就是方便程序段的定义和修改. 1.关于预定义替代 #define Conn(x,y) x##y#define ToChar(x) ...
- C/C++编程笔记:C++入门知识丨从结构到类的演变
先来看看本节知识的结构图吧! 接下来我们就逐步来看一下所有的知识点: 结构的演化 C++中的类是从结构演变而来的, 所以我们可以称C++为”带类的C”. 结构发生质的演变 C++结构中可以定义函数, ...
- 【Unity Shaders】学习笔记——SurfaceShader(二)两个结构体和CG类型
[Unity Shaders]学习笔记——SurfaceShader(二)两个结构体和CG类型 转载请注明出处:http://www.cnblogs.com/-867259206/p/5596698. ...
- Swift学习笔记(10):类和结构体
目录: 基本 属性 方法 下标 继承 基本 使用class和struct关键字定义类和结构体. ・类是引用类型,结构体和枚举是值类型 ・值类型被赋予给一个变量.常量或被传递给一个函数时,已值拷贝方式传 ...
- 【VS开发】【编程开发】【C/C++开发】结构体中的数组与指针的内存分配情况说明
[VS开发][编程开发][C/C++开发]结构体中的数组与指针的内存分配情况说明 标签:[VS开发] [编程开发] 主要是疑惑在结构体定义的数组的内存空间与指针动态分配的内存空间,在地址上连续性.以及 ...
- 《从零开始学Swift》学习笔记(Day 25)——类和结构体定义
原创文章,欢迎转载.转载请注明:关东升的博客 Swift中的类和结构体定义的语法是非常相似的.类使用class关键词定义类,使用struct关键词定义结构体,它们的语法格式如下: class 类名 { ...
- C语言笔记 08_函数指针&回调函数&字符串&结构体&位域
函数指针 函数指针是指向函数的指针变量. 通常我们说的指针变量是指向一个整型.字符型或数组等变量,而函数指针是指向函数. 函数指针可以像一般函数一样,用于调用函数.传递参数. 函数指针变量的声明: / ...
随机推荐
- python基础——9(迭代器、生成器)
一.迭代器 1.概念 器:包含了多个值的容器 迭代:循环反馈(一次从容器中取出一个值) 迭代器:从装有多个值的容器中一次取出一个值给外界 s = 'abcdef' ls = [1,2,3,4,5] 遍 ...
- hadoop学习爬坑记录
1. Q: hdfs管理界面50070端口设置后,无法访问情况. A: 1)停止当前所有服务./stop-all.sh 2)在hdfs-site.xml中,更改开放端口的绑定IP: <prope ...
- cf891a Pride
倘若存在 1,那么答案是 \(n-cnt_1\). 否则,设最短的公约数为 1 的区间长度为 \(minlen\),答案是 \(minlen-1+n-1\). #include <iostrea ...
- python3--命名空间字典
命名空间字典 我们学到了模块的命名空间实际上是以字典的形式实现的,并且可以由内置属性__dict__显示这一点.类和实例对象也是如此:属性点号运算其实内部就是字典的索引运算,而属性继承其实就是搜索连结 ...
- ajax 原生 post
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- shell的for循环
与其他编程语言类似,Shell支持for循环. for循环一般格式为: for 变量 in 列表 do command1 command2 ... commandN done 列表是一组值(数字.字符 ...
- excel截取某个字符之前的值
1.find为查找函数,返回字符的位置,语法find(查找字符,被查字符或者单元格) 找到第一个-位置 2.left,字符截取函数,从左边开始,left(被截取的字符,个数)
- Xcode的代码块和代码块注释
我们看到的这些
- 解开Future的神秘面纱之任务执行
此文承接之前的博文 解开Future的神秘面纱之取消任务 补充一些任务执行的一些细节,并从全局介绍程序的运行情况. 任务提交到执行的流程 前文我们已经了解到一些Future的实现细节,这里我们来梳理一 ...
- 【2018.11.23】2018WCTest(8)
T1 小 $X$ 无敌就是指他的防御 $\ge$ 怪物的攻击 $n$.另外小 $X$ 最多只需要把攻击加到怪物的防御 $k$,此时已经能一招秒一个,再多加必定无用且需承受更多伤害. $20$ 分 $d ...