代码之家  ›  专栏  ›  技术社区  ›  David Claridge

如何编写类似于__FILE的cpp __DIR__宏__

  •  9
  • David Claridge  · 技术社区  · 17 年前

    这 __FILE__ 和 __LINE__ 预处理器,通常用于打印带有文件名和行号的调试输出。我需要类似的东西,但路径末尾只有目录的名称。例如,如果我的代码在: /home/davidc/some/path/to/some/code/foo/bar我需要一个宏,它只会给我“bar”,如果代码在/home/davidc/some/path/to/some/code/fou/bee中,那么我需要它给我“bee”。

    有什么想法吗?(顺便说一句,这是针对C++应用程序的)。

    5 回复  |  直到 10 年前
        1
  •  9
  •   D.Shawley    17 年前

    如果你使用GNU make 为了构建你的项目,你或许可以这样做:

    %.o: %.cpp
        $(CC) $(CFLAGS) -D__DIR__="$(strip $(lastword $(subst /, , $(dir $(abspath $<)))))" -c $< -o $@
    

    这一定是我很长一段时间以来在Makefile中想到的最可怕的事情。我认为你不会在编译器的范围内找到一种快速或干净的方法来做到这一点,所以我会寻找聪明的方法将信息注入编译过程。

    祝你好运。

        2
  •  3
  •   Paul Hsieh    17 年前

    没有内置的宏,但很明显,您可以编写自己的小解析例程,该例程接收一个文件并提取给定完整路径文件名的目录名。让我们调用此函数:

    extern std::string parseLastDir (const char *path);
    

    然后你可以制作一个这样的宏:

    #define __DIR__ parseLastDir (__FILE__)
    

    它的行为有点像你想要的(它给你一个std::string而不是char*,这样清理就可以更好地定义),具有相关的语义(它的结果取决于它被调用的文件,所以它总是得到正确的目录。)

        3
  •  2
  •   Brian Gianforcaro    17 年前

    根据您的编译器/软件的构建方式,您可以在编译时将宏声明为当前路径或任何路径。

     gcc -D__DIR__=/usr/src/test/ test.c
    

    我从未使用过MS编译器,但我知道ICC也有类似的选项。

    gcc manpage

        4
  •  2
  •   Alex Hajnal Robert Massaioli    6 年前

    你想要的是类似于unix的东西

    __BASE_FILE__
    

    看看周围 http://theory.uwinnipeg.ca/localfiles/infofiles/gcc/cpp_13.html 我希望这能有所帮助。

    编辑: 第二次尝试

    使用#line预处理器命令怎么样。您也可以使用它来更改文件名变量,如下所示: http://www.cppreference.com/wiki/preprocessor/line

        5
  •  0
  •   Oren S    17 年前

    如何更改你的makefile/build系统,以便 .../bar/file.cc 编译行将包括 -D__DIR__ bar 这应该更容易些。..