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

时间:2015-10-22 19:30:06

标签: 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我想也许问题是函数(HLSL ...)由于宏中的__FUNCTION__而被用作变量。但是根据the GCC documentation:“GCC提供了三个魔术变量,它们保存当前函数的名称,作为一个字符串”,所以我不相信这就是问题所在。还有其他想法吗?

1 个答案:

答案 0 :(得分:0)

使用我找到的解决方案更新此内容。

感谢上述人员让我更多地调查ERR。事实证明,在另一个头文件中有ERR的重复定义似乎导致了我的错误。更改debug.h中ERR的定义以避免此冲突修复了我的问题。 :)