C语言的预处理之条件编译

例:

定义头文件 math.h 如下:

#ifndef C_MATH_H
#define C_MATH_H

    int sum(int a, int b);

#endif //C_MATH_H

在c文件中,如果引入math.h,#ifndef 可以解决重复引入的问题,重复引入相当于源代码被引入多次,编译器会报错。

指令

#ifdef        如果定义了

#ifndef      如果没有定义

#if             如果...

#elif          同else if

#else        

#endif        结束

例:

#if defined(MACRO) 等价于 #ifdef MACRO

使用场景

1. 区分环境

#include <stdio.h>

void log(char *info) {
#ifdef DEBUG
    printf("log info:%s\n", info);
#endif
}

int main() {
    log("this is start...");
    printf("this is main method!!\n");
    log("this is end...");
}

没有定义DEBUG宏的时候,打印结果:

this is main method!!

定义DEBUG宏后

#include <stdio.h>

#define DEBUG

void log(char *info) {
#ifdef DEBUG
    printf("log info:%s\n", info);
#endif
}

int main() {
    log("this is start...");
    printf("this is main method!!\n");
    log("this is end...");
}

打印结果:

log info:this is start...
this is main method!!
log info:this is end...

如果不在代码中定义DEBUG,也可以在编译的时候传递参数编译

在CMake中增加

target_compile_definitions(${name} PUBLIC DEBUG)
cmake_minimum_required(VERSION 3.17)

get_filename_component(ProjectId ${CMAKE_CURRENT_SOURCE_DIR} NAME)
STRING(REPLACE " " "_" ProjectId ${ProjectId})
project(${ProjectId} C)

set(CMAKE_C_STANDARD 11)

file(GLOB files "${CMAKE_CURRENT_SOURCE_DIR}/*.c")
foreach(file ${files})
    get_filename_component(name ${file} NAME)
    add_executable(${name} ${file} include/math.h src/mach.c)
    target_compile_definitions(${name} PUBLIC DEBUG)
endforeach()

执行结果:

log info:this is start...
this is main method!!
log info:this is end...

2. 区分C代码还是C++代码

3. 区分操作系统

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值