*符号代表全部的意思*.i代表的是全部的点i文件
宏定义 :
1.定义:
- #define 宏名+ 常量
- 功能:宏名代替常量,宏名要求全大写且见名知义
2.示例:
#include <stdio.h>
#define PI 3.14
#define Q 4
#define P Q+Qint main(){float r =0;printf("input r:");scanf("%f",&r);float area = PI*r*r;printf("area = %.2f\n",area);//3.14*2*2printf("P*P=%d",P*P);//4+4*4+4=24原样替换return 0;
}
- 编译器会将宏原样替换:
-
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)执行一次(使用过后没有数值的返回),若想多行需要加/进行拼接
if else使用时将{ }加上
当使用多条函数调用时:加大括号或使用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;
}
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;
}
条件编译
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;
}
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
2. 功能文件 :
xxx.c主要存放用户编写的逻辑代码函数,不包括main函数
3. 组合逻辑的文件 :
main.c用于组合功能文件提供的函数接口
3.添加#ifndef的必要性
- #ifndef HEADER_NAME_H
- #define HEADER_NAME_H
- // 头文件内容,如函数声明、宏定义、结构体声明等
- #endif // HEADER_NAME_H
感谢诸君将我的文章看完,希望我的文章能对各位有所帮助