如何编写cpp __DIR__宏,类似于__FILE__

时间:2009-10-20 00:30:37

标签: c++ directory c-preprocessor

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

有什么想法? (顺便说一下,这是一个C ++应用程序)。

更新:要清楚,我正在使用一个宏,它会在编译时给我一个包含目录名的字符串,我不想在运行时进行任何字符串处理。

5 个答案:

答案 0 :(得分:9)

如果您使用GNU make来构建项目,那么您可以执行以下操作:

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

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

祝你好运。

答案 1 :(得分:4)

没有内置的宏,但显然你可以编写自己的小解析例程,它接受一个文件并撕掉给定的完整pathed文件名的目录名。让我们调用这个函数:

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

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

#define __DIR__ parseLastDir (__FILE__)

它会表现得像你想要的那样(它给你一个std :: string而不是char *,以便更好地定义清理)和相关的语义(其结果取决于调用它的文件,所以它总是得到正确的目录。)

答案 2 :(得分:2)

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

__BASE_FILE__

浏览一下http://theory.uwinnipeg.ca/localfiles/infofiles/gcc/cpp_13.html。我希望这会有所帮助。

编辑:尝试两次

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

答案 3 :(得分:2)

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

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

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

gcc manpage

答案 4 :(得分:0)

如何更改makefile / build系统,以便.../bar/file.cc编译行包含-D__DIR__ bar。它应该更容易......