zoukankan      html  css  js  c++  java
  • C语言条件编译

    条件编译中使用的预编译指令

    条件编译是根据实际定义宏(某类条件)进行代码静态编译的手段。可根据表达式的值或某个特定宏是否被定义来确定编译条件。

    #define            定义一个预处理宏
    #undef            取消宏的定义

    #if                   编译预处理中的条件命令,相当于C语法中的if语句
    #ifdef              判断某个宏是否被定义,若已定义,执行随后的语句
    #ifndef            与#ifdef相反,判断某个宏是否未被定义
    #elif                若#if, #ifdef, #ifndef或前面的#elif条件不满足,则执行#elif之后的语句,相当于C语法中的else-if
    #else              与#if, #ifdef, #ifndef对应, 若这些条件不满足,则执行#else之后的语句,相当于C语法中的else
    #endif             #if, #ifdef, #ifndef这些条件命令的结束标志.
    defined          与#if, #elif配合使用,判断某个宏是否被定义

    预编译指令应用举例

    1. #define、#undef

    #define命令定义一个宏:
    宏定义,按照是否带参数通常分为对象宏、函数宏两种。

    对象宏: 不带参数的宏被称为"对象宏(objectlike macro)"。对象宏多用于定义常量、通用标识。例如:

    // 常量定义
    #define MAX_LENGTH 100
    // 通用标识,即 printf 函数的调用可代替名称
    #define SLog printf

    函数宏:带参数的宏。利用宏可以提高代码的运行效率: 子程序的调用需要压栈出栈, 这一过程如果过于频繁会耗费掉大量的CPU运算资源。 所以一些代码量小但运行频繁的代码如果采用带参数宏来实现会提高代码的运行效率。但多数c++程序不推荐使用函数宏,调试上有一定难度,可考虑使用c++的inline代替之。例如:

    // 最小值函数
    #define MIN(a,b) ((a)>(b)? (a):(b))
    // 安全释放内存函数
    #define SAFE_DELETE(p) {if(NULL!=p){delete p; p = NULL;}}

    #undef可以取消宏定义,与#define对应。

    2. defined

    defined用来测试某个宏是否被定义。defined(name): 若宏被定义,则返回1,否则返回0。


    它与#if、#elif、#else结合使用来判断宏是否被定义,乍一看好像它显得多余, 因为已经有了#ifdef和#ifndef。defined可用于在一条判断语句中声明多个判别条件;#ifdef和#ifndef则仅支持判断一个宏是否定义。此外和#if、#elif、#else不同,#ifdef、#ifndef 不同的,defined测试的宏可以是对象宏,也可以是函数宏。

    #if defined(VAX) && defined(UNIX) && !defined(DEBUG) 

    3. #ifdef、#ifndef、#else、#endif

    防止头文件重复包含

    最常见的条件编译是防止重复包含头文件的宏,也就是达到 #pragma once 的目的,如下面的代码:

    1 #ifndef A_H
    2 #define A_H
    3 
    4 //...
    5 
    6 #endif

    在实际使用中,比较常用:

     1 #ifdef _ONLINE
     2 
     3 // ... 做一些操作
     4 
     5 #endif
     6 
     7 #ifdef _LOCAL
     8 
     9 // ... 做一些其它操作
    10 
    11  #endif

    想执行哪一段代码,就在前面#define _ONLINE或者_LOCAL

    _DEBUG宏

    有些代码,想要使得在debug的时候执行,release的时候不不执行,就可以这么做。

    #ifdef _DEBUG
    
    
    #endif

    对于_DEBUG,当你用生成时,VS的开发环境则自动的加上这个宏定义;release时,没有这个宏。

  • 相关阅读:
    机器学习之决策树与随机森林模型
    深度学习入门篇--手把手教你用 TensorFlow 训练模型
    Android 性能测试之方向与框架篇
    机器学习:从入门到第一个模型
    5分钟教你玩转 sklearn 机器学习(上)
    Hbase 技术细节笔记(上)
    五年 Web 开发者 star 的 github 整理说明
    腾讯云发布第三代云服务器矩阵,开放更强计算力赋能产业智能化
    为什么要用深度学习来做个性化推荐 CTR 预估
    云 MongoDB 优化让 LBS 服务性能提升十倍
  • 原文地址:https://www.cnblogs.com/czc1999/p/11507988.html
Copyright © 2011-2022 走看看