c/c++ 预编译

  c/c++ 以 # 开头的都是预编译指令: #define、#include  #if(判断表达式), #ifdef、#ifndef(判断宏)

#ifdef A              
语句
#else
语句
#endif

  --   如果是头文件,那么#ifndef 相反

  --- 功能: 判断A 表示符是否存在

******************************************************************

#ifndef __A____H__123 //如果没有__AH__这个宏,那么就编译#endif之间的这些代码,如果有的话,就不编译了
#define __A____H__123 //具体宏的名字是自定义的  
//在#ifndef中的宏,一定要大写和下划线,必要的时候加数字,目的是为了避免和其他头文件中的宏名字冲突

//#ifndef __头文件名称__H_: 名称定义

int max(int a, int b);
int add(int a, int b);//函数的声明

#endif

******************************************************************

//条件预处理
// #define MESSAGE_TEXT 1
// #define MESSAGE_FILE 2
// #define MESSAGE_VIDEO 3

// #define MESSAGE_TYPE  MESSAGE_TEXT

// int main(){
//     #if MESSAGE_TYPE == MESSAGE_TEXT
//         printf("文本消息.....");
//     #elif MESSAGE_TYPE == MESSAGE_FILE
//         printf("文件消息.....");
//     #elif MESSAGE_TYPE == MESSAGE_VIDEO
//         printf("视频消息.....");
//     #else
//         printf("没有这个类型......");
//     #endif
//     //extern "C":可以支持C/C++混合编译
//     getchar();
//     return 0;
// }

******************************************************************

常量和宏区别:
 const:  需要指定类型
 define: 只是一个替换工作,在编译的是时候执行
****** 1. 宏函数***********

/*定义宏函数*/
#define GET_MAX(A,B) A>B?A:B

void main(){

int result = GET_MAX(a, b);

    system("pause")

}

*****2. 方法名称替换***********

int com_dreamsdeng_max(int a, int b){
    return a > b ? a : b;
}

/*方法名称替换*/
#define call(METHOD_NAME1,A,B) com_dreamsdeng_##METHOD_NAME1(A,B)

void main(){


    int a = 100;
    int b = 200;

    int  result = call(max, 400, 50);
        
    printf("%d------>打印出来\n", result);
        
    system("pause");

}

*********************** 3. 宏实际中使用,日志打印*****************************

//日志输出
// #define LOG_E(FORMAT,...) printf("ERROR:"); printf(FORMAT,__VA_ARGS__);
// #define LOG_I(FORMAT,...) printf("INFO:"); printf(FORMAT,__VA_ARGS__);
// #define LOG_D(FORMAT,...) printf("DEBUG:"); printf(FORMAT,__VA_ARGS__);

//以下将代码抽取(简化了)
// #define LOG(LEVEL,FORMAT,...) printf(LEVEL); printf(FORMAT,__VA_ARGS__);
// #define LOG_I(FORMAT,...) LOG("INFO:",FORMAT,__VA_ARGS__)
// #define LOG_D(FORMAT,...) LOG("DEBUG:",FORMAT,__VA_ARGS__)
// #define LOG_E(FORMAT,...) LOG("ERROR:",FORMAT,__VA_ARGS__)

// int main(){
//     LOG("Error","%d\n",200);
//     LOG_D("%d\n",100);
//     LOG_E("%s\n","Hello world!")
//     getchar();
//     return 0;
// }

  ***********************  4. 系统内置宏  ****************************

特殊宏:

printf("%s 的 %d 行出错!\n", __FILE__, __LINE__); // 出错文件

printf("%s -- %s ", __DATE__, __TIME__); // 出错日期、时间

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编译原理是计算机科学中的一门重要课程,主要研究的是将高级语言编写的程序转化为计算机能够理解和执行的机器语言的过程。而C/C++是一种广泛应用的高级编程语言,其编译原理与其他编程语言相似。 C/C++的编译原理包括了多个步骤。首先,预处理器会对源代码进行处理,包括宏展开、头文件包含以及条件编译等。接下来,编译器将转化预处理后的代码为汇编代码。然后,汇编器将汇编代码转化为可重定位的机器代码。最后,链接器将可重定位的机器码和库文件等结合,生成最终的可执行文件。 在编译过程中,编译器会进行语法分析和语义分析。语法分析主要是通过词法分析、语法分析和语法制导翻译等步骤,将源代码转化为语法树。语义分析是对语法树进行分析,检查语法的正确性,并进行类型检查等。 在编译过程中,还会进行优化。优化主要分为前端优化和后端优化。前端优化是在源代码转化为中间表示形式之前进行的优化,包括常量折叠、公共子表达式删除等。后端优化是在中间表示形式转化为目标代码之前进行的优化,包括指令调度、寄存器分配等。 总的来说,C/C++的编译原理是一个复杂的过程,涉及到词法分析、语法分析、语义分析、优化等多个步骤。通过这一过程,将高级语言编写的程序转化为计算机能够执行的机器语言,从而实现程序的正确执行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值