c++ - 表达式不能用作宏扩展中的函数

标签 c++ gcc macros

我正在尝试编译一些代码(使用GCC 4.8.2),并且正在获取error: expression cannot be used as a function

这是相关的代码。

debug.h

// A macro for code which is not expected to be reached under valid assumptions
#if !defined(NDEBUG)
#define UNREACHABLE() do { \
    ERR("\t! Unreachable reached: %s(%d)\n", __FUNCTION__, __LINE__); \
    assert(false); \
    } while(0)
#else 
    #define UNREACHABLE() ERR("\t! Unreachable reached: %s(%d)\n", __FUNCTION__, __LINE__)
#endif

someFile.cpp (仅默认行确实相关)
HLSLBlockEncoder::HLSLBlockEncoderStrategy HLSLBlockEncoder::GetStrategyFor(ShShaderOutput outputType)
{
    switch (outputType)
    {
      case SH_HLSL9_OUTPUT: return ENCODE_LOOSE;
      case SH_HLSL11_OUTPUT: return ENCODE_PACKED;
      default: UNREACHABLE(); return ENCODE_PACKED;
    }
}

错误:
/.../debug.h:123:90: error: expression cannot be used as a function
     #define UNREACHABLE() ERR("\t! Unreachable reached: %s(%d)\n", __FUNCTION__, __LINE__)
                                                                                          ^
/.../someFile.cpp:217:16: note: in expansion of macro 'UNREACHABLE'
       default: UNREACHABLE(); return ENCODE_PACKED;
                ^

我试图了解为什么会发生错误。在查看this question时,我认为问题可能是由于宏中的__FUNCTION__,函数(HLSL ...)被用作变量。但是根据the GCC documentation的说法:“GCC提供了三个魔术变量,它们以字符串的形式保存了当前函数的名称”,所以我不认为这是问题所在。还有其他想法吗?

最佳答案

用我发现的解决方案更新它。

感谢以上那些告诉我进一步研究ERR的人。事实证明,另一个头文件中ERR的定义重复,这似乎已导致我的错误。更改debug.h中的ERR的定义以避免这种冲突,从而解决了我的问题。 :)

关于c++ - 表达式不能用作宏扩展中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33289151/

相关文章:

c++ - [C++] 在此代码之前不存在的析构函数中抛出的内存错误。尝试制作一个新的动态数组并填充它

c++ - 顶点不渲染 - DirectX

gcc - 为什么链接器会终止我?当我构建 CLang 时

ios - 使用示例在 Swift 3 中编写宏

recursion - 递归宏使无限递归

c++ - 使用 OpenMP 查找并行集合的最小值,C++

c++ - 'help' 编译器如何从作为函数的模板参数推导出函数模板返回类型?

c - 为什么 gcc/clang 默认知道链接到 libc?

c++ - C/C++ 中的字符串化运算符

macros - 定义名称基于宏参数的函数的宏