【发布时间】:2011-09-13 07:31:42
【问题描述】:
我(曾经)使用__FILE__ 和__LINE__ 宏从我的代码中打印诊断消息。当您将 GCC 与 make 一起使用时,这非常有效,该文件与您在命令行中指定的一样短。我最近切换到使用 CodeLite,它在构建时使用完全限定的文件名(至少在 Windows 下)。突然间,我的诊断输出几乎不可读了。
有没有办法在预处理器中只获取文件名的文件组件?我可以接受非便携式 GCC 特定解决方案。 (我将回退到普通的__FILE__ 其他情况。)
当然,我可以通过函数传递__FILE__ 的内容并仅提取文件组件,但对于不应更改运行时行为的诊断消息,我不考虑字符串操作...
注意:我使用 GNU 使用文件名的方式。路径是文件名的集合,文件名是文件的相对或绝对标识符。文件名可以由目录组件和文件组件组成。
【问题讨论】:
-
诊断确实会改变运行时行为(否则不会有诊断),并且是否调用一个额外的函数几乎没有什么区别,因为输出本身正在调用库函数来执行输出。
-
打印一条诊断消息通常涉及到除了几十个字符串操作之外,还有一些不太友好的文件 I/O 操作。出于某种原因,似乎没有人担心这一点。为什么要担心添加对另一个仅影响诊断消息的无副作用函数的调用?
-
你们说的都是对的,添加诊断不是免费的。我是这样实现的,我让它通过一个函数。我更想知道它是否存在。它肯定不是标准的,但是找到有关此的文档并不完美。 (甚至 gcc 手册也没有概述每个预定义的宏。)
-
关于 I/O;并非每个诊断都必须打印到 STDOUT/STDERR 或文件。听说过应用程序崩溃时输出的环形缓冲区吗?例如 GNU Nana 实现了这一点。与对性能“几乎”没有影响的文件 I/O 相比。
-
仅供参考,还有 c++ constexpr 解决方案:stackoverflow.com/a/38237385/52074
标签: gcc c-preprocessor filenames