如何在预处理器中只获取文件名?

rio*_*oki 7 filenames gcc c-preprocessor

我(是)使用__FILE____LINE__宏从我的代码中打印诊断消息.当您将GCC与make一起使用时,这非常有效,该文件与您在命令行中指定的文件一样短.我最近切换到使用CodeLite,它在构建时使用完全限定的文件名(至少在windows下).突然间,我的诊断输出几乎无法读取.

有没有办法在预处理器中只获取文件名的文件组件?我可以使用非便携式GCC特定解决方案.(我将回到__FILE__其他案件.)

当然我可以通过__FILE__函数传递内容并仅提取文件组件,但字符串操作不是我想到的诊断消息,不应该改变运行时行为...

注意:我使用GNU使用它的方式使用文件名.Path是文件名的集合,文件名是文件的相对或绝对标识符.文件名可以由目录组件和文件组件组成.

Fre*_*oke 9

如果您正在使用GNU Make,那么您可以在编译的预处理阶段简单地传递-D BASE_FILE_NAME = \"$*.c \"(如果您单独执行它们,或者在单个阶段进行编译,这是规范).

这取决于您确定文件名的方式.我来自普通文件名列表,并在稍后阶段使用makefile中的函数作为目录前缀.

IE,这适合我,但你的里程可能会有所不同!:-)

我的make"代码"的简化版本:

CLASSES = main.c init.c

PREPROCESSED = $(patsubst %.c,$(PPCDIR)/%.pp.c,$(CLASSES))

$(PREPROCESSED): $(PPCDIR)/%.pp.c: %.c $(ALLH) 
    $(GCC) $(GCCOPTS) -D BASE_FILE_NAME=\"$*\" -E $< > $@
Run Code Online (Sandbox Code Playgroud)

您可以根据需要在代码中使用BASE_FILE_NAME :-)


小智 5

为了回复上面的FredCooke,您可以交换以下行:

-D BASE_FILE_NAME=\"$*.c\"
Run Code Online (Sandbox Code Playgroud)

带有:

-D BASE_FILE_NAME=\"$(<F)\"
Run Code Online (Sandbox Code Playgroud)

这也将为您提供适当的文件名扩展名,以及.cpp文件名。


rio*_*oki 4

没有已知的预处理器宏可以提供该功能。传递__FILE__函数似乎是唯一明智的选择。

  • @fret:对我来说,`__BASE_FILE__`输出与`__FILE__`相同。如果您阅读链接到的文档,它会提供带有“main”函数的文件的名称(不一定是基本名称)(甚至不是当前文件)。 (3认同)