预处理以及定义

预处理是编译之前做的一些事情。

1. 常用的预定义符号(预先定义好的符号,代表着某种意思):

__FILE__       //当前编译的文件路径

__FUNCTION__    //当前所在函数的函数名

__DATE__         //当前编译日期

__TIME__     //当前编译时间

//以上格式占位符都用%s,如:printf("%s",__DATA__);

__LINE__   //当前行数,格式占位符用%d,如printf("%d",LINE);  //注意以上这些宏定义的前后分别有两个"_",而不是一个下划线

__CRT_SECURE_NO_WARNINGS         //关闭安全检查,在写代码时候加上

#define  _CRT_SECURE_NO_WARNINGS 可以关闭安全检查的警告

2. 宏定义

宏定义的本质就是替换

2.1 宏定义-无参宏: #define 宏名  内容

比如定义一个宏:

#define PI 3.1415926  //用PI代替3.1415926

#define A 4+3    //用A代替4+3

2.2 宏定义-带参宏: #define 宏名(参数列表) 内容

带参宏类似一个函数,和函数的区别是参数是没有类型的、带参宏没有返回值。注意调用的时候是先替换再运算,多重调用也是先整体替换完成后再运算。

比如定义一个宏:

#define FUN(a,b){printf("%d,%d\n",a,b);printf("%d\n",a+b);}

#define F(a,b) a+b  

3. 常量的定义

const int a=10;   //在定义变量前加const 

常量不允许被修改,常量必须初始化

4. 文件包含

我们想用库函数就需要包含头文件,也就是文件包含,当然也可以编写自定义头文件,包含自己编写的头文件。

4.1. 文件包含的基本格式:

#include<文件名> 或者#include "文件名",如:

#include   //包含系统头文件用<>,只会在系统头文件中找

#include "文件名"  //包含自定义头文件用"",在自定义头文件中找不到就会在系统头文件中去找

文件包含允许嵌套,即在一个被包含的文件中可以包含其他文件。

4.2. 头文件的重复包含

头文件的嵌套包含可能会引起头文件的重复包含,从而出现函数和变量重复定义的问题,所以需要避免头文件中重复包含,某些宏定义一句可以防止头文件重复包含,如:

#pragma once //防止头文件重复包含,不让文件的内容被包含两次,在头文件最前面添加

#pragma oce 是vs独有的,有使用平台的限制,其他平台可能不存在。

避免重复包含还有一种方法:

#ifndef __TOOL_H__        //如果没有定义,就执行下面的语句定义

#define __TOOL_H__    //定义

//在头文件中一般只声明函数,相当于一个功能。然后在同名的源文件中定义,实现功能

void fun(); 

#endif          //和ifndef对应,结束if这个代码块

5. 条件编译

条件编译就是根据不同的条件编译不同的代码段

#if....#else....#endif    //判断的是#if后面的条件真假

#ifdef....#else.....#endif                   //判断的是#ifdef后面的宏是否定义了

#ifndef....#else.....#endif                   //判断的是#ifndef后面的宏是否定义了

你可能感兴趣的:(C语言,linux,运维,服务器)