宏定义———C语言

*符号代表全部的意思*.i代表的是全部的点i文件

宏定义 :

1.定义:

  • #define   宏名+ 常量
  • 功能:宏名代替常量,宏名要求全大写且见名知义

 2.示例:

#include <stdio.h>
#define PI 3.14
#define Q 4
#define P Q+Q

int main(){
    float r =0;
    printf("input r:");
    scanf("%f",&r);
    float area = PI*r*r;
    printf("area = %.2f\n",area);//3.14*2*2
    printf("P*P=%d",P*P);//4+4*4+4=24原样替换
    return 0;
}

fbac511079714154ab4552a499084d9a.png

  • 编译器会将宏原样替换:
  • gcc -E define——01.c -o define_01.i(预处理时进行原样替换)
    vi define_01.i

3.宏函数

语法:#define Clii(x)  (x*x)#define 宏函数名(参数1,参数2)表达式

#include <stdio.h>
#define M 10
#define CALC(x)   (x * x)//防止原样替换
int main(){
    printf("M = %d\n",M);
    printf("Result = %d\n", CALC(M + M));
    return 0;
}

4.嵌入式开发常用宏操作 do...while(0)

定义宏函数:

#include <stdio.h>
void print_demo1(){
    printf("demo first\n");
}
void print_demo2(){
    printf("demo second\n");
}
void print_demo3(){
    printf("demo second\n");
}
#define   TEST()     print_demo1();print_demo2(); print_demo3();
int main(){
    TEST(); //单独使用无任何副作用;
    return 0;
}

在添加使用:各种逻辑语句时容易出现问题

嵌入式常用:do{x*x;}while(0)执行一次(使用过后没有数值的返回),若想多行需要加/进行拼接

05a4e4a243d0489ca9d9e2a7b6439736.png

if   else使用时将{ }加上

e852733d4f894222a638f1fc8b551c05.png

当使用多条函数调用时:加大括号或使用do while语句do while 不会提供返回值只会执行函数

5.字符串化运算符#

将传入的值转化为字符串

eg:x = 4+2 #define CALC(x)printf(#x"=%d\n",x)

#include <stdio.h>
#define CALA(m) printf(#m"=%d\n",m);
#define N 10
#define SS(N) printf(#N);//不需要""即可将数字或其他的转化为字符串
int main(){
    CALA(3+4);
    SS(N);
    return 0;
}

 6bcfba0957be40209c626a650ed348ec.png

6.不定参数宏

_VA_ARGS_:表示可变参数列表,传入的参数都放置于_VA_ARGS_中

#include <stdio.h>
#define LOG(...)    printf(__VA_ARGS__)
#define LOGSTR(fm,...)  printf(fm,__VA_ARGS__);
int main(){
    LOG("This Time is %d o'clock\n",12);
    LOG("This Time is %d:%d:%d\n",11,9,23);
    LOGSTR("data = %d%s\n",100,"RMB");
    return 0;
}

 

7ff00c9b278d4b10b9d69d4dfe2341fd.png

条件编译

1.命令行参数:

int main(int argc,char*argv[]) 计算命令行输入值的个数argc 参数的个数 argv 参数内容(都是以字符串的形式出现)

#include <stdio.h>

int main(int argc,const char* args[]){
    printf("argc=%d\n",argc);
    printf("args[0]=%s\n",args[0]);
    printf("args[1]=%s\n",args[1]);
    return 0;
}

03d9185ea12749efb842ab3d91ac4d60.png

2.新代码注释(条件编译)

 #if 宏名

  代码块

#endif

宏名为真,则编译代码

 #if 宏名

   代码块1

#else

   代码块2

#endif

如果宏名为真,则编译代码块1,否则编译代码块2

  • 生产环境:不建议完全关闭日志,至少保留错误日志并定期轮转。可以考虑优化日志的存储方式和级别。
  • 开发环境:应该打开详细的日志输出,以帮助排查问题。合理配置日志级别,避免开发过程中不输出日志而导致问题难以定位。

 多文件编程

 

1.extern关键字

功能:声明变量或函数是来源于其它文件的全局变量或全局函数

 eg:

#include <stdio.h>
extern int global_variable;//extern大多用于头文件
extern void show();
int main(){
        printf("global_variable=%d\n",global_variable);
        show();
        return 0;
}

2.多文件编程框架

1. 头文件 xxx.h

3fb2db93d3f44c738514c84e31e0a78e.png

2. 功能文件 :

xxx.c主要存放用户编写的逻辑代码函数,不包括main函数

3. 组合逻辑的文件 :

main.c用于组合功能文件提供的函数接口

3.添加#ifndef的必要性

  • #ifndef HEADER_NAME_H
  • #define HEADER_NAME_H
  • // 头文件内容,如函数声明、宏定义、结构体声明等
  • #endif // HEADER_NAME_H

感谢诸君将我的文章看完,希望我的文章能对各位有所帮助 

 0c68a8b8227f4bdcb776b848e10e4597.png

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值