【问题标题】:"undeclared identifier" error in simple macro expansion简单宏扩展中的“未声明的标识符”错误
【发布时间】:2009-05-20 13:27:02
【问题描述】:

我有一个非常简单的宏,用于声明异常时的速记。在调试模式下,它会添加当前文件和行号。

我正在修改我的代码以支持 unicode,但每次使用我的宏时突然出现“未声明的标识符”错误。我可能错过了一些非常简单的东西,因为宏本身相当简单。谁能告诉我是什么问题?

这是宏声明:

#ifdef _DEBUG
#define EXCEPTION(msg, mm) Exception(msg, mm, _T(__FILE__), _T(__LINE__))
#else
#define EXCEPTION(msg, mm) Exception(msg, mm)
#endif

我认为不需要,但以防万一,这里是异常构造函数声明:

Exception(LPCTSTR msg, BOOL manageMsg = FALSE, LPCTSTR f = NULL, int l = -1);

在发布模式下编译时我没有收到任何错误,但在调试模式下我会遇到,所以它与 __FILE__ 和 __LINE__ 位有关,但我无法弄清楚实际问题是什么。

【问题讨论】:

  • 发布完整的实际错误消息、如何使用宏的示例以及代码中哪一行导致错误的指示。
  • 完整的错误。这就是为什么我无法弄清楚问题出在哪一部分。错误消息中没有其他内容。

标签: visual-c++ unicode macros


【解决方案1】:

这与我遇到的问题不完全相同,但我在这里发布了我的问题的解决方案,因为我在调查期间遇到了这个问题。

如果您在使用多行宏时遇到此错误消息,请在编辑器中打开可见空白。行尾的 '\' 继续符后可能有空格:

#define FOO_BAR(aFoo) \ 
    FOO_BASE(aFoo, "bar")

末尾的空格使解析器将宏定义的第一行解析为完整的(FOO_BAR 扩展为'\'),第二行被解释为函数声明,因此是“未声明的标识符'aFoo'” )。

【讨论】:

    【解决方案2】:

    __LINE__ 宏的计算结果为整数。 _T 宏将L 放在字符串的前面,使它们成为Unicode 字符串。它后面应该跟一个双引号,例如L"file.cpp"。但在您的情况下,它后面是 __LINE__ 扩展为的整数文字。你会得到这样的东西:L23。摆脱第二个_T 调用。

    #define EXCEPTION(msg, mm) Exception(msg, mm, _T(__FILE__), __LINE__)
    

    如果您包含编译器无法识别的标识符名称,这可能更容易诊断。编译器通常会在其错误消息中包含该信息。

    【讨论】:

    • 没有名字。整个错误是“未声明的标识符”。这就是为什么我无法弄清楚。
    • 就是这样。我对 _T() 宏的添加有点过分热心。我知道这很愚蠢!
    猜你喜欢
    • 2020-08-10
    • 2013-03-12
    • 2019-06-09
    • 2017-07-11
    • 2013-01-22
    • 2011-10-25
    • 2011-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多