C语言中的__FILE__、__LINE__和#line

原文链接:

 

http://hi.baidu.com/419836321/blog/item/fcf5ceec484681cfb31cb1f7.html

 

 

 

 

C语言中的__FILE__用以指示本行语句所在源文件的文件名,举例如下(test.c):
  1. #include <stdio.h>
  2. int main()
  3. {
  4. printf("%s\n",__FILE__);
  5. }
在gcc编译生成a.out,执行后输出结果为:
test.c
在windows的vc6.0下编译执行结果为:
c:\documents and settings\administrator\桌面\test.c


----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


C语言中的__LINE__用以指示本行语句在源文件中的位置信息,举例如下:

  1. #include <stdio.h>



  2. main()
  3. {
  4. printf("%d\n",__LINE__);
  5. printf("%d\n",__LINE__);
  6. printf("%d\n",__LINE__);
  7. };
该程序在linux用gcc编译,在windows的vc6.0下编译都可以通过,执行结果都为:
7
8
9

还可以通过语句#line来重新设定__LINE__的值,举例如下:
  1. #include <stdio.h>


  2. #line 200  //指定下一行的__LINE__为200
  3. main()
  4. {
  5. printf("%d\n",__LINE__);
  6. printf("%d\n",__LINE__);
  7. printf("%d\n",__LINE__);
  8. };
编译执行后输出结果为:
202
203
204

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

另外gcc还支持__func__,它指示所在的函数,但是这个关键字不被windows下的vc6.0支持,举例如下:
  1. #include <stdio.h>
  2. void main()
  3. {
  4. printf("this is print by function %s\n",__func__);
  5. }
其编译后输出结果为
this is print by function main




注意 “#line”、 “__LINE__”、 “__FILE__" 及 “__func__" 都是大小写敏感的。

 

### C语言 `__location__` 宏的使用 在C语言中,`__location__` 并不是一个标准定义的宏。然而,在某些编译环境中,特别是嵌入式开发环境或其他特定工具链中,可能会遇到类似的宏用于记录源文件的位置信息。 对于常见的GNU编译器集合(GCC),以及微软的Visual Studio 编译器,通常提供了一系列内置宏来实现类似功能[^1]。这些宏可以用来获取当前文件名、行号以及其他上下文信息: - 文件名称可以通过预定义宏 `__FILE__` 获取。 - 行号则通过 `__LINE__` 来表示。 - 函数名称可能依赖于 `_FUNCTION_`, `_ pretty_function _`(注意实际应用时去掉空格),这取决于所使用的编译器版本支持情况[^2]。 如果希望创建类似于 `__location__` 的效果,即组合上述多个位置信息,则可以根据需求自行定义这样的宏。下面是一个简单的例子展示如何构建这样一个宏: ```c #define STRINGIFY(x) #x #define TOSTRING(x) STRINGIFY(x) #ifdef __GNUC__ // GCC Clang 支持 #define LOCATION "File:" __FILE__ ", Line:" TOSTRING(__LINE__) ", Function:" __PRETTY_FUNCTION__ #elif defined(_MSC_VER) // MSVC 支持 #define LOCATION "File:" __FILE__ ", Line:" TOSTRING(__LINE__) ", Function:" __FUNCSIG__ #else // 默认情况下不包含函数名 #define LOCATION "File:" __FILE__ ", Line:" TOSTRING(__LINE__) #endif ``` 此代码片段展示了根据不同编译器特性定制化输出当前位置的方法。当程序运行并触发该宏所在的地方时,将会打印出相应的文件路径、具体行数及所在的函数签名(如果有)。请注意,不同平台上的表现形式会有所差异,因此建议开发者查阅对应编译器的手册以获得最准确的信息[^4]。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值