Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何编写类似于_文件的cpp _DIR__宏___C++_Directory_C Preprocessor - Fatal编程技术网

C++ 如何编写类似于_文件的cpp _DIR__宏__

C++ 如何编写类似于_文件的cpp _DIR__宏__,c++,directory,c-preprocessor,C++,Directory,C Preprocessor,\uuuu文件和\uuuu行宏内置在C预处理器中,通常用于打印带有文件名和行号的调试输出。我需要类似的东西,但路径末尾只有目录名。例如,如果我的代码位于: /home/davidc/some/path/to/some/code/foo/bar我需要一个只给我“bar”的宏,如果代码在/home/davidc/some/path/to/some/code/foo/bee中,那么我需要它给我“bee” 有什么想法吗?(BTW,这是一个C++应用程序)。 更新:明确地说,我正在寻找一个宏,该宏在编译时

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

有什么想法吗?(BTW,这是一个C++应用程序)。
更新:明确地说,我正在寻找一个宏,该宏在编译时会给我一个包含目录名的字符串,我不想在运行时进行任何字符串处理。

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

extern std::string parseLastDir (const char *path);
然后您可以制作如下宏:

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

它的行为类似于您想要的(它给您一个std::string而不是char*,以便更好地定义清理),并具有相关的语义(其结果取决于调用它的文件,因此它总是得到正确的目录。)

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

__BASE_FILE__
四处看看。我希望这有帮助

编辑:尝试两次


使用#line预处理器命令怎么样。您也可以使用它来更改文件名变量,正如您在此处看到的:

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

 gcc -D__DIR__=/usr/src/test/ test.c
我从未使用过MS编译器,但我知道ICC也有类似的选项


如何更改makefile/build系统,以便对于
../bar/file.cc
而言,编译行将包含
-D\uu DIR\uuu.bar
。如果您正在使用GNU
make
构建项目,那么您可能可以执行以下操作:

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

$(CC)$(CFLAGS)-D_uudir_uu=“$(strip$(lastword$(subst/,$(DIR$)(abspath$)问题是,我希望'parseLastDir'在编译时发生(没有理由不能,因为文件是预先确定的)。我在想,也许boost::mpl中的某些东西或宏中的其他一些黑客模板元编程可以让我这么做。。这是为了一个性能相当关键的应用程序,我不想在运行时浪费时间做不必要的字符串处理。woops,忘了应该是_FILE uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuILE时间访问字符串文字-这是不可能的。看起来我们将有编译时间字符串处理,虽然在C++ 1x。好,但你所要求的是受语言本身的定义限制。C++不包含真正的元编程语言,因为你需要(显然LISP可以做到这一点没有问题。)过去人们遇到这样的问题的一种方法是编写自己的预处理器或使用其他现有的处理器。我觉得C++模板是图灵完成的。所以C++确实有真正的元编程。谢谢,但这不是我所追求的。我正在编译一个大型项目,有数百个文件在不同的方向上。Res,每个文件都可以包含这个宏,它将返回对应于它自己的源文件位置的目录名,我不想“硬编码”到任何地方的路径。哦,是的,我在LinuxClose上使用G++,但是没有雪茄。这将文件名/路径传递给G++,所以它砍掉了一些以前的PAR。路径的ts,但不提供我想要的最后一个目录(因为我的代码在一堆子目录中),所以现在我只得到foo/bar,而不是/home/davidc/some/path/to/some/code/foo/bar,关闭了,但不幸的是仍然是同一个问题。该死,太近了。我要继续找。哦,你比我快了一分钟——我做的几乎是完全一样的事情。如果最后一个目录中有空格,它就不太管用了,否则它就是完美的解决方案。相信我——我以前在Makefiles中见过更糟糕的怪物。@Adam:今晚我只需要做一些修正,以获得从零开始的版本号。从07.64到08.01会给我们带来很多不必要的痛苦。我正在使用CMake,所以我应该能够做到这一点。谢谢!@D.Shawley:这只适用于t中的文件我想唯一的解决办法是替换预处理器或者建议另一个扩展。