C++预处理总结、系统性学习心得

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liunan199481/article/details/82699552

预处理

  1. 不带参数的宏定义
  2. 带参数的宏定
  3. #include语句的用法
  4. 条件编译命令的使用
    • #pragma
    • #line
    • #undef
    • #ifdef #ifndef
    • #if

不带参数的宏定义

#define PI 3.14
# 表示这是一条预处理命令
PI 宏名,它是一个标识符
3.14 字符串,它是代替宏名的真实值

* 在编译预处理时,每当遇到PI就自动用3.14替换。
* 注意:程序中出现的字符串中若含有宏名则不进行替换
* 可以用#undef终止宏定义作用域

#define TEST "test"
int main()
{
    printf(TEST);
#undef TEST
}

带参数的宏定义

  • 例如:
#define MAX(a,b) ((a>b)?(a):(b))
  • 带参宏定义特点点:
    • 优点)简单函数用带参宏定义,不存在函数调用,可增加代码执行速度
    • 缺点)没法进行类型检查,因为不是函数嘛
    • 注意)加括号,加括号,加括号,重要的事情说三遍。

#include命令

#include "stdio.h"
#include <stdio.h>
  • 上面2个方法有和区别?
    • 用<>,系统到存放c/c++库函数头文件所在目录中寻找要包含的头文件。
    • 用“”,先在当前目录找要包含的头文件;没有再如上面一样去找。
    • 用“”可以使用绝对路径和相对路径
  • 这里有关头文件,那么什么内容放在头文件里?
    • 宏定义
    • 结构体、联合、枚举
    • typedef声明
    • 外部函数
    • 全局变量
    • 需要注意的几点:
      • 一个include只能包含一个头文件
      • 文件包含可以嵌套包含,一个被包含文件也可以包含别的文件
      • 若一个文件包含另一个,编译后就成为一个文件,2个文件中的全局静态变量通用,不需要用extern声明。

条件编译

#if 常数表达式
    语句块
#endif
  • 若常数表达式为真,就编译语句块
int main()
{
    int NUM=40;
    int i = 0;
    #if NUM>20
        i++;
    #endif      
}
  • 还可以有else分支,用法同 if else
int main()
{
    int NUM=40;
    int i = 0;
    #if NUM>20
        i++;
    #else
        i--;
    #endif      
}

int main()
{
    int NUM=40;
    int i = 0;
    #if NUM>20
        i++;
    #elif NUM>10
        i--;
    #elif NUM>0
        i+=2;
    #endif      
}
  • 个人感觉上面不是太常用,但是下面这些就很常用~
  • #ifdef 及#ifndef命令
    • 前面 #if 命令需要判断符号常量所定义的具体值,但有时不需要判断具体值,只需要知道符号有没有被定义,这是就采用这种方式定义。
#ifdef USE_TEST_DLL
    语句段1
#else
    语句段2
#endif
// 若定义了USE_TEST_DLL,则编译语句段1;否则,编译语句段2.
  • #ifndef 与其类似
  • 在实际开发中,常遇到这种用法,防止头文件被重复包含
#ifndef _TEST_ADD_H_
#define _TEST_ADD_H_
#else
    ...
#endif
  • #line
    • 用来改变LINEFILE的内容,主要是用于调试,不说了。
  • #pragma命令
    • 作用是设定编译器状态,或者指示编译器完成特定动作
    • 后面可跟的参数:
    • message:在编译信息输出窗口输出相应信息
    • code_seg: 设置程序中函数代码存放的代码段。
    • once:保证头文件被编译一次,我们经常会看到,头文件第一行就是 #pragma once
    • 这个和上面 #ifndef 功能很像是不是,他们还有一些区别。但是我想说的是上面的 #ifndef 方式是c++标准支持的方式,便于代码的平台移植,这个嘛,编译器支持的,移植代码要看脸喽~**

小记:这篇文章是我看c++编程实战(清华大学出版社)整理出来的,有上面错误的地方请指正~

猜你喜欢

转载自blog.csdn.net/liunan199481/article/details/82699552