注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Tsecer的回音岛

Tsecer的博客

 
 
 

日志

 
 

gcc中__FILE__路径的由来  

2014-11-09 21:20:49|  分类: Gcc源代码分析 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
一、文件名不同
在一个工程中,注意到一个小细节,就是同一个文件同一处打印文件名不同,其内容大致如下:
tsecer @harry: find
.
./main.c
./Makefile
./foo.h
./inc
./inc/trans.c
tsecer @harry: cat main.c 
#include "foo.h"
int main()
{
bar();
baz();
}
tsecer @harry: cat foo.h 
#include <stdio.h>
static int bar()
{
printf("%s\n", __FILE__);
}
tsecer @harry: cat inc/trans.c 
#include "foo.h"
int baz()
{
        return bar();
}
tsecer @harry: cat Makefile 
main: main.o inc/trans.o
        gcc  $^ 
main.o:
        gcc main.c -c
inc/trans.o:
        cd inc && gcc -I `pwd`/.. trans.c -c
clean:
        rm *.o inc/*.o

tsecer @harry: make
gcc main.c -c
cd inc && gcc -I `pwd`/.. trans.c -c
gcc  main.o inc/trans.o 
tsecer @harry: ./a.out 
foo.h
/data/harry/harrywork/gccinc/inc/../foo.h
tsecer @harry: 
二、gcc实现
看gcc的实现,它会保存一个文件名的栈,当读取到include预处理指令时,如果是双引号包含,则以最后一个栈中文件所在的文件夹为基础路径,include内文件名为文件路径,如果查找成功则把include内文件名入栈;否则在所有命令行中指定的路径内搜索。
这里有一个原则,就是所有文件路径,也就是__FILE__宏打印的文件名,它是相对于gcc执行时所在文件路径,这个路径无论include如何变化,都是如此,所以__FILE__中显示的路径如果不是绝对路径,就是相对于gcc当前工作路径的相对路径。
/* Return the directory from which searching for FNAME should start,
   considering the directive TYPE and ANGLE_BRACKETS.  If there is
   nothing left in the path, returns NULL.  */
static struct cpp_dir *
search_path_head (cpp_reader *pfile, const char *fname, int angle_brackets,
 enum include_type type)

{
……
  /* For #include_next, skip in the search path past the dir in which
     the current file was found, but if it was found via an absolute
     path use the normal search logic.  */
  if (type == IT_INCLUDE_NEXT && file->dir)
    dir = file->dir->next;
  else if (angle_brackets)
    dir = pfile->bracket_include;
  else if (type == IT_CMDLINE)
    /* -include and -imacros use the #include "" chain with the
       preprocessor's cwd prepended.  */
    return make_cpp_dir (pfile, "./", false);
  else if (pfile->quote_ignores_source_dir)
    dir = pfile->quote_include;
  else
    return make_cpp_dir (pfile, dir_name_of_file (file), 如果是双引号包含,则第一个搜索目录是包含者所在目录
pfile->buffer ? pfile->buffer->sysp : 0);
……
}
  评论这张
 
阅读(354)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017