【问题标题】:__FILE__ not giving full path__FILE__ 没有给出完整路径
【发布时间】:2014-02-17 00:16:15
【问题描述】:

如果我在下面这样做:

#include <stdio.h>

int main()
{

 printf ("%s\n",__FILE__);
 return 0;

}

>gcc cfilename.c
>./a.out
>cfilename.c
>pwd
>/home/tek/cpp
> gcc -v
> gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)

只打印文件名,我认为它应该用完整的路径打印,谷歌搜索告诉我人们要求帮助只获取文件名?

【问题讨论】:

标签: c


【解决方案1】:

ISO C 标准(目前是 C11)对__FILE__ 预定义宏的内容有这样的说法:

__FILE__:当前源文件的假定名称(字符串文字)。

就是这样。内容的格式没有规定,所以我怀疑实现可能会通过将其设置为 "some file I found in the /src tree" 并仍然声称符合性。

因此,它在其中放置的内容基本上取决于实现。您需要调查特定的实现以了解它们如何处理它。例如,gcc 编译器完全按照您在命令行中指定的方式使用该文件,因此,如果您想要完整路径,则必须更改命令行,例如:

gcc -o myexec $(pwd)/myexec.c

有趣的是,gcc 似乎对包含的文件做了 相反的。使用时:

#include "myheader.h"

__FILE__ 宏设置为头文件的完全扩展。


如果您有一个没有以您需要的方式设置__FILE__的实现,那么没有什么能阻止您创建自己的: p>

dodgycc -o myexec -DMY_FILE_NAME=$(pwd)/myexec.c myexec.c

(其中dodgycc 编译器的-D 选项定义了您需要的预处理器标记)。

【讨论】:

  • 源文件总是在给定的路径中找到,相对于 CWD,没有歧义。相对于任何已配置的标头搜索路径,可以找到具有给定名称的标头或具有多个组件的包含名称标记。如果__FILE__ 没有提及找到标头的搜索路径,那么多个文件可以为__FILE__ 提供相同的值,这将是不明确的。
  • ... 另外值得一提的是,如果您希望 __FILE__ 产生特定的结果,那么 #line 指令是可行的方法。无论如何,+1。
猜你喜欢
  • 2011-07-04
  • 2011-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-19
  • 1970-01-01
  • 1970-01-01
  • 2013-02-11
相关资源
最近更新 更多