c++ - 警告 : disabled expansion of recursive macro

标签 c++ clang llvm gdcm

我目前正在使用 MacOSX 默认编译器构建 GDCM 项目:clang。此编译器在其自己的 header 中触发警告(请参阅 ref ):

In file included from /Users/builder/external/GDCM/Source/MediaStorageAndFileFormat/gdcmJPEG12Codec.cxx:21:
/Users/builder/external/GDCM/Source/MediaStorageAndFileFormat/gdcmJPEGBITSCodec.cxx:336:9: warning: disabled expansion of recursive macro [-Wdisabled-macro-expansion]
    if (setjmp(jerr.setjmp_buffer))
        ^
/Users/builder/llvm/llvm-rel-install/bin/../include/c++/v1/setjmp.h:40:21: note: expanded from macro 'setjmp'
#define setjmp(env) setjmp(env)
                    ^
In file included from /Users/builder/external/GDCM/Source/MediaStorageAndFileFormat/gdcmJPEG12Codec.cxx:21:
/Users/builder/external/GDCM/Source/MediaStorageAndFileFormat/gdcmJPEGBITSCodec.cxx:724:9: warning: disabled expansion of recursive macro [-Wdisabled-macro-expansion]
    if (setjmp(jerr.setjmp_buffer))
        ^
/Users/builder/llvm/llvm-rel-install/bin/../include/c++/v1/setjmp.h:40:21: note: expanded from macro 'setjmp'
#define setjmp(env) setjmp(env)
                    ^
2 warnings generated.

这要么是 llvm header 中的一个明显错误(我很难相信),要么我遗漏了一些关于在 C++98 中使用 setjmp 的内容.

最佳答案

两者都不是。这不是 LLVM header 中的错误,也不是您遗漏了 setjmp 的使用,而是您启用了一个警告,该警告恰好也会在完全有效的代码上触发。大多数警告都会。这就是为什么它们是警告而不是错误。此特定警告恰好主要在有效代码上触发。这就是为什么它默认不启用,甚至不包含在 -Wall 中,甚至不包含在 -Wextra 中。然而你还是启用了它。这很好,但是您应该准备好处理结果。

关于c++ - 警告 : disabled expansion of recursive macro,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34704422/

相关文章:

c++ - 在带有斜杠的路径上返回std::filesystem::create_directories()的值

llvm - 如何从 LLVM IR 的指令元数据中提取操作数?

ios - 如何在 macOS 上的 lldb 中查看别名的定义?

c++ - std::vector 查找是否比执行简单操作更快?

c++ - 通过 hash_map<string, fnPtr> 调用函数指针是否比 C++ 中的多个 if/else if/else 语句更有效或更好?

c++ - 结构数组在调用时打印零,但在未调用时显示正确的输入(短代码)

c++ - 如何填充整数之间的分隔符而没有多余的分隔符?

c++ - 是否允许编译器优化堆内存分配?

xcode:如何使用 GCC_VERSION 字段指定 clang 版本?

ruby - 是否有任何 ruby​​ VM 是使用 LLVM 工具链完成的?