c语言 include 预编译 结构体快捷命名 typedefine

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();
}

结构体

  1. 在创建的时候直接创建一个变量,或者一个指针

    
    #include <stdio.h>//系统文件
    
    
    struct person
    {
        int age;
        char *name;
    }structs,*p;//直接创建一个structs 变量和 一个指针
    
    
    void main(){
    
    
         structs = { 18, "jack" };
         p = &structs;
        getchar();
    }
  2. 匿名结构体

可以起到限制结构体变量数量作用 类似单例

#include <stdio.h>//系统文件



struct 
{
    int age;
    char *name;
}structs;//直接创建一个structs 变量 ,并且这个结构体没有名字也就说只有一个变量


void main(){


     structs = { 18, "jack" };

    getchar();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值