我正在使用__FILE__
和__LINE__
宏从我的代码中打印诊断消息。当您将GCC与make一起使用时,这非常有效,该文件与您在命令行中指定的文件一样短。我最近切换到使用CodeLite,它在构建时使用完全限定的文件名(至少在windows下)。突然间,我的诊断输出几乎无法读取。
有没有办法在预处理器中只获取文件名的文件组件?我可以使用非便携式GCC特定解决方案。 (我会回到普通__FILE__
其他案件。)
当然,我可以通过函数传递__FILE__
的内容并仅提取文件组件,但字符串操作不是我想到的那些不应该改变运行时行为的诊断消息......
注意:我使用GNU使用它的方式使用文件名。 Path是文件名的集合,文件名是文件的相对或绝对标识符。文件名可以由目录组件和文件组件组成。
答案 0 :(得分: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 $< > $@
您可以根据需要在代码中使用BASE_FILE_NAME: - )
答案 1 :(得分:5)
在回复上面的FredCooke时,您可以交换此行:
-D BASE_FILE_NAME=\"$*.c\"
使用:
-D BASE_FILE_NAME=\"$(<F)\"
这也将为.cpp提供正确的文件名扩展。
答案 2 :(得分:4)
没有已知的预处理器宏提供该功能。通过功能接缝传递__FILE__
,这是唯一明智的选择。
答案 3 :(得分:0)
正如在其他答案中已经提到的那样,做到这一点的唯一可移植方法是通过从编译器传入定义,但是存在编译器的特殊扩展:
__FILE_NAME__
__BASE_FILE__