首页 > 其他分享 >预处理和条件编译

预处理和条件编译

时间:2023-06-16 14:35:58浏览次数:36  
标签:__ 头文件 编译 user 条件 DEBUG include 预处理

一、问题引入

在编程过程中,使用预处理指令最多的是:

  • #define BUFFER_MAX_SIZE 1024 //明示常量

  • #include "xxx.h" //头文件包含

但其他预处理指令使用的稍微少点,例如:#ifdef #else #endif #ifndef #if #elif #line #error #pragma

二、解决过程

2-1 避免用户自定义头文件重复包含

若头文件:user1.h 中已经包含头文件:user.h了,但在源文件src.c中进行如下包含操作便会报错:

src.c

#include "user1.h"
#include "user.h"

//...

原因:因为预处理器对头文件user1.h展开的所有头文件都会包含进来,包括user.h,然而用户在源文件中又一次把user.h包含进来

正确处理user.h的重复包含可以这样处理:

user.h

#ifndef __USER_H__
#define __USER_H__

//...

#endif

2-2 debug模式

在编写代码过程少不了进行测试打印输出,以及来回修改。一般人可能会来来回回进行编写、删除,但其实可以通过条件编译解决,只需要一个宏开关。

#include <stdio.h>

#define DEBUG

int main(void)
{
    int list[5] = {1, 2, 3, 4, 5};
    #ifdef DEBUG // 若宏DEBUG定义了,则编译如下代码
        printf("debug mode:\n");
    #endif // 结束一个if预处理
    for (int i = 0; i < 5; ++i)
    {
        printf("list[%d]:%d\n", i, list[i]);
    }

    return 0;
}

若想取消debug mode,仅需要注释语句:#define DEBUG 即可

三、反思总结

四、参考引用

C Primer Plus (第6版) 中文版

标签:__,头文件,编译,user,条件,DEBUG,include,预处理
From: https://www.cnblogs.com/caojun97/p/17476958.html

相关文章

  • C语言-预处理
    简介C语言编译器在编译程序之前,会先使用预处理器(preprocessor)处理代码。预处理器首先会清理代码,进行删除注释、多行语句合成一个逻辑行等工作。然后,执行#开头的预处理指令。本章介绍C语言的预处理指令。预处理指令可以出现在程序的任何地方,但是习惯上,往往放在代码的开头部分。每......
  • CMake命令行添加编译参数
    CMake命令行添加编译参数学习自coroserver例程:https://github.com/windoze/coroservercoroserver是一个应用Boost.Asio和Boost.Coroutine的多线程TCP服务器。README中有编译命令行示例:`CXXFLAGS="-std=c++11-stdlib=libc++"LDFLAGS="-stdlib=libc++"cmake[options]pa......
  • VC2010编译 thrift compiler
    VC2010编译thriftcompiler需flex,bison.bison依赖m4,regex.Pre-Buildevent中flex命令有误,-o与参数间不应该有空格。flex-o"src\\thriftl.cc"src/thriftl.llbison-y-o"src\thrifty.cc"--defines="src/thrifty.h"src/thrifty.yycompiler......
  • MinGw编译Boost
    MinGw编译Boost(金庆的专栏)在MinGwShell中运行bootstrap.sh失败Jinq@jinqing-pc/d/src/boost_1_52_0$bootstrap.shtoolset=gccBuildingBoost.Buildenginewithtoolsetgcc...FailedtobuildBoost.BuildbuildengineConsult'bootstrap.log......
  • Linux编译Windows共享目录下代码
    Linux编译Windows共享目录下代码(金庆的专栏)万神服务器代码是跨平台的。平时策划在Windows上开自己的服务器测试,测试和发布服务器为Linux.开发时,先在Windows上编译测试,再到Linux上编译测试。因为用VC开发,可以使用VAssist,MetalScroll工具辅助,开发效率......
  • 基础语法-条件
    if只写一个判断也是可以的 swichswitch是Java中的一种条件语句,用于根据表达式的值选择不同的执行路径。它可以用来代替一系列的if-else语句,使代码更简洁和易读。switch(expression){casevalue1://当expression的值等于value1时执行的代码......
  • C#将字符串编译成程序集并执行
    实现将字符串编译为代码并在程序中使用,实际应用可将字符串保存在文件中,程序启动后读取文件中字符转换为代码执行,这样只需要修改文件不改动代码就可以增删或修改程序功能,提高程序的灵活性。例如,要实现下面的代码:usingSystem;namespaceTestSpace{classTest{......
  • (2023.6.15)linux下can的调试工具交叉编译
    //源码包路径:https://public.pengutronix.de/software/libsocketcan/libsocketcan-0.0.11.tar.bz2https://public.pengutronix.de/software/socket-can/canutils/v4.0/canutils-4.0.6.tar.bz2//编译命令./configure--host=arm-linux-gnueabihf--prefix=/home/fangzeli/work/......
  • 编译时去除未使用的依赖库
    如下,--no-as-needed会把所有指定的库标记为NEEDED,即使没用到;--as-needed会忽略没用到的库;$cc-Wl,--no-as-neededxx.c-ldl-lz-lm-lpthread$ldda.outlinux-vdso.so.1(0x00007fffc03d1000)libdl.so.2=>/lib/x86_64-linux-gnu/libdl.so.2......
  • cryptopp 交叉编译
    1、下载地址https://www.cryptopp.com/#download2、解压后进入对应目录3、执行:exportCXX=aarch64-linux-gnu-g++   说明:aarch64-linux-gnu-g++为交叉编译器4、执行:exportCXXFLAGS="-O2-fPIC-pipe-Wall-shared"   说明:这样得到的静态库和动态库会比不执行此步......