例:
定义头文件 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...