2009-05-20 106 views
0

我有一个非常简单的宏,用于声明异常时的简写。在调试模式下,它添加当前文件和行号。简单的宏扩展中的“未声明的标识符”错误

我正在修改我的代码以支持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__位有关的,但我无法弄清楚实际问题是什么。

+0

发布完整的实际错误消息,如何使用宏的示例以及代码中哪一行导致错误的指示。 – 2009-05-20 13:31:12

+0

*是*完整的错误。这就是为什么我无法弄清楚问题的部分原因。错误消息中没有其他内容。 – Herms 2009-05-20 14:02:20

回答

3

__LINE__宏计算为整数。 _T宏在字符串的前面放置了一个L以使它们成为Unicode字符串。它的意思是后面跟着一个双引号,如L"file.cpp"。但在你的情况下,它后面跟着__LINE__扩展到的整数字面值。你得到这样的东西:L23。拨打第二个电话_T

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

这可能是更容易,如果你已经包括编译器不承认标识符的名称诊断。编译器通常在错误信息中包含这些信息。

2

这与我的问题不完全相同,但我在此发布解决方案以解决我的问题,因为我在调查过程中遇到了此问题。

如果您遇到此错误消息并带有多行宏,请在编辑器中打开可见的空白。在该行的末尾“\”符后,您可能有空白:

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

末的空间导致解析器解析宏定义为完整的(foo_bar这样扩大到“第一线\ '),第二行被解释为函数声明,因此“未声明的标识符”aFoo'“)。