C语言中的 _FILE_ 、_LINE_ 、_func_ 和 #line

C语言中 

1、_FILE_ 用于指示本行代码所在源文件的文件名;

2、_LINE_用于指示本行代码所在源文件中的位置(行数);

3、_func_用于指示本行代码所在函数(函数名);

4、#line用于重新设定下一行代码的行数;

注:"_FILE_"、"_LINE_"、"_func_"、"#line"均大小写敏感

例:

1、_FILE_

### C语言中 `##__VA_ARGS__` `##args` 的区别及用法 #### 宏展开中的 `##` 运算符 在C语言的预处理阶段,`##` 是一种连接运算符,用于将两个标记(token)拼接在一起。当它出现在宏定义中时,可以用来移除多余的逗号或者实现更复杂的宏逻辑。 --- #### `##__VAARGS__` 的作用 `##__VA_ARGS__` 主要用于处理可变参数的情况。它的核心功能是在没有传递任何额外参数的情况下,自动移除前面多余的逗号,从而避免语法错误[^1]。 例如,在以下宏定义中: ```c #define DEBUG_LOG(fmt, ...) printf("[%s:%d]" fmt "\n", __FILE__, __LINE__, ##__VA_ARGS__) ``` 如果调用了 `DEBUG_LOG("Message")` 而未传入其他参数,则 `##__VA_ARGS__` 会移除逗号,使得最终生成的代码合法[^4]。 --- #### `##args` 的作用 `##args` 并不是一个标准的C语言特性,而是某些特定编译器扩展的一部分。通常情况下,`args` 可能是一个占位符名称,表示一组参数列表。然而,与 `__VA_ARGS__` 不同的是,`args` 需要在具体的上下文中由程序员显式定义其含义。 假设存在如下宏定义: ```c #define MY_MACRO(x, args...) do_something(x, ##args) ``` 在这种场景下,`##args` 表现类似于 `##__VA_ARGS__`,即当 `args` 参数为空时,移除多余的逗号[^5]。不过需要注意的是,这种形式并非跨平台通用,可能仅适用于部分支持非标准特性的编译器环境。 --- #### 关键差异对比 | 特性 | `##__VA_ARGS__` | `##args` | |-----------------|---------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------| | **标准化程度** | 属于ISO C99及以上版本的标准组成部分 | 非标准特性,依赖具体编译器的支持 | | **适用范围** | 常见于现代C/C++项目中涉及可变参数宏的设计 | 较少使用;更多出现在早期或特殊用途代码里 | | **灵活性** | 自动识别并适配任意数量的实际参数 | 需要开发者手动指定参数名 (`args`) ,增加了复杂度 | --- #### 实际应用案例分析 以下是两种方式的具体应用场景比较: ##### 使用 `##__VA_ARGS__` ```c #include <stdio.h> // 正确处理带或不带附加参数的情形 #define LOG(fmt, ...) printf("[LOG]%s(): " fmt "\n", __func__, ##__VA_ARGS__) void example_function(void){ LOG("This is a log message."); LOG("Value: %d.", 42); } int main(){ example_function(); return 0; } ``` 运行结果: ``` [LOG]example_function(): This is a log message. [LOG]example_function(): Value: 42. ``` ##### 尝试使用 `##args` 由于这不是普遍接受的做法,下面的例子仅供说明目的,并不一定能在所有环境中正常工作。 ```c #include <stdio.h> // 注意:此写法未必兼容所有工具链 #define PRINTF_WRAPPER(format_string, args...) printf(format_string, ##args) int main(){ PRINTF_WRAPPER("Test without extra params.\n"); PRINTF_WRAPPER("With param: %d\n", 123); return 0; } ``` 尽管两者看起来相似,但由于缺乏统一规范,推荐优先采用基于 `__VA_ARGS__` 的解决方案以提高移植性可靠性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值