6月1日 10:35

C语言预定义宏和条件编译怎么用?__FILE__/ifdef/## 详解

C语言标准定义了一组预定义宏,在编译时由预处理器自动展开,主要用于调试和条件编译。常用宏包括:__FILE__展开为当前源文件名(字符串),__LINE__展开为当前行号(整数),__DATE__和__TIME__分别展开为编译日期和时间,func(C99)展开为当前函数名,__STDC__在符合标准的编译器下展开为1。条件编译通过#if、#ifdef、#ifndef、#elif、#else、#endif控制代码是否参与编译,核心指令是#ifdef和#ifndef,常用于头文件保护和平台适配。defined运算符可在#if表达式中检测宏是否定义,不关心其值。#pragma once是主流编译器扩展,等价于头文件保护但更简洁。宏的高级操作符中,#将宏参数字符串化,##将两个宏参数粘合为一个标识符。

追问

__FILE__展开的是源文件路径还是文件名?

取决于编译器实现。GCC通常展开为编译时传入的路径,可能是相对路径也可能是绝对路径。同一份代码不同编译方式下__FILE__的值可能不同。

#pragma once和#ifndef保护哪个更好?

#pragma once更简洁且不会宏名冲突,但不是C标准,极少数边缘情况(符号链接同一文件)可能误判。#ifndef是标准方案,可靠但冗长。实践中#pragma once已足够,大型项目两者结合使用。

defined运算符和#ifdef有什么区别?

#ifdef MACRO只能检测单个宏,defined可用在#if表达式中组合逻辑判断,如#if defined(A) && !defined(B),灵活性更高。

条件编译能检测C语言版本吗?

可以。C99起定义了__STDC_VERSION__宏,值为长整型常量如199901L(C99)、201112L(C11)。通过#if STDC_VERSION >= 201112L可按版本选择性编译。

标签:C语言