include 解释
include”” 和include<>区别
include”“可以导入系统已经定义的头文件和自定义的文件
include<>只能导入系统文件
案例:
include”” 进行文本替换
项目结构:
myhead.h源码:
printf("hello i'm head file\n");
源.c
#include <stdio.h>//系统文件
void main(){
#include "myhead.h"//我们定义头文件
}
运行结果:
include”” 定义函数声明 并写一个实现类
项目目录:
myhead.h源码:
void test();//函数声明
实现类 .c 源代码:
#include<stdio.h>
//函数实现
void test(){
printf("函数test");
}
源.c源码
#include <stdio.h>//系统文件
#include "myhead.h"//我们定义头文件
void main(){
test();
getchar();
}
输出:
include”” 循环套用
项目目录:
A.h源码:
# include"B.h"
B.h源码
# include"A.h"
可见相互嵌套 形成类似一个死循环
源.c
#include <stdio.h>//系统文件
#include"A.h"
void main(){
getchar();
}
编译结果:
解决方法1:
A.h修改:
#ifndef FLAGHEAD
#define FLAGHEAD
//执行 如果定义了宏定义FLAGHEAD
# include"B.h"
#else
//执行else结果
#endif
B.h修改:
#ifndef FLAGHEAD2 //如果没有定义宏定义FLAGHEAD2
#define FLAGHEAD2 //定义宏定义
//执行 如果定义了宏定义FLAGHEAD2
# include"A.h" //导入头文件
#else
//执行else结果
#endif
解决方法2 较高编译版本才可以:
B.h修改:
#pragma once
# include"A.h"
A.h修改:
#pragma once
# include"B.h"
define 文本替换
#include <stdio.h>//系统文件
#define MAX 100
void main(){
int a = MAX;
printf("%d\n",a);
getchar();
}
输出:
#ifdef __cplusplus检测是c还是c++
__cplusplus是c++所定义的一个宏
来看下工程目录:
c语言.c 源码:
#include <stdio.h>//系统文件
void main(){
#ifdef __cplusplus
printf("当前是c++语言");
#else
printf("当前是c语言");
#endif
getchar();
}
输出结果:printf(“当前是c语言”);
c++语言.cpp 源码:
#include <stdio.h>//系统文件
void main(){
#ifdef __cplusplus
printf("当前是c++语言");
#else
printf("当前是c语言");
#endif
getchar();
}
输出结果:printf(“当前是c++语言”);
宏函数
#include <stdio.h>//系统文件
void fmy_add(){
printf("add函数");
}
void fmy_sub(){
printf("sub函数");
}
//#define 函数别名(替换参数A)函数部分名##替换参数A();
#define functionTest(NAME)fmy_##NAME();
void main(){
functionTest(add);
getchar();
}
输出:add函数
#include <stdio.h>//系统文件
void fmy_add(){
printf("add函数");
}
void fmy_sub(){
printf("sub函数");
}
//#define 函数别名(替换参数A)函数部分名##替换参数A();
#define functionTest(NAME)fmy_##NAME();
void main(){
functionTest(sub);
getchar();
}
输出:sub函数
我们看下带参数的宏函数
#include <stdio.h>//系统文件
void fmy_add(int a,int b){
printf("add函数 a+b=%d",a+b);
}
void fmy_sub(int a, int b){
printf("sub函数 a-b=%d", a - b);
}
//#define 函数别名(替换参数B,替换参数C)函数名(##替换参数B,##替换参数C);
//#define 函数别名(替换参数B,替换参数C)函数名(替换参数B,替换参数C);
//替换参数作为函数输入参数的时候可以不写##
//#define functionTest(NAME,A,B)fmy_sub(A,B);
#define functionTest(NAME,A,B)fmy_sub(##A,##B);//这里故意不用NAME
void main(){
functionTest(1, 13, 11);
getchar();
}
在补充个:
#define LOG(LEVEL,FORMAT,...) printf(##LEVEL);printf(##FORMAT,__VA_ARGS__);//这里会连续输出两个printf
#define LOG_I(FORMAT,...) LOG("INFO:",##FORMAT,__VA_ARGS__);
#define LOG_E(FORMAT,...) LOG("ERROR:",##FORMAT,__VA_ARGS__);
#define LOG_W(FORMAT,...) LOG("WARN:",##FORMAT,__VA_ARGS__);
typedefine
类型可以自定义名字 结构体 基本变量类型 指针等
案例足以:
#include <stdio.h>//系统文件
typedef int myint;
typedef float myfloat;
struct MyStruct
{
int age;
char *name;
};
typedef struct MyStruct mystruct;
typedef mystruct * mystructP;
void main(){
myint a = 1;//等价 int a =1;
myfloat b = 1;//等价 float b =1;
mystruct structs = { 18, "jack" };//等价 struct MyStruct structs ={18,"jack"}
mystructP p = &structs;//等价struct MyStruct * p=&structs
getchar();
}
结构体
在创建的时候直接创建一个变量,或者一个指针
#include <stdio.h>//系统文件 struct person { int age; char *name; }structs,*p;//直接创建一个structs 变量和 一个指针 void main(){ structs = { 18, "jack" }; p = &structs; getchar(); }
- 匿名结构体
可以起到限制结构体变量数量作用 类似单例
#include <stdio.h>//系统文件
struct
{
int age;
char *name;
}structs;//直接创建一个structs 变量 ,并且这个结构体没有名字也就说只有一个变量
void main(){
structs = { 18, "jack" };
getchar();
}