我有一个非常简单的宏,在声明异常时我用它来做速记。在调试模式下,它会添加当前文件和行号。
我正在修改我的代码以支持unicode,而且每当使用我的宏时,我都会收到“未声明的标识符”错误。我可能错过了一些非常简单的东西,因为宏本身很简单。谁能说出问题是什么?
这是宏声明:
#ifdef _DEBUG
#define EXCEPTION(msg, mm) Exception(msg, mm, _T(__FILE__), _T(__LINE__))
#else
#define EXCEPTION(msg, mm) Exception(msg, mm)
#endif
我不认为这是必要的,但为了以防万一,这里是Exception构造函数声明:
Exception(LPCTSTR msg, BOOL manageMsg = FALSE, LPCTSTR f = NULL, int l = -1);
在发布模式下进行编译时,我没有收到任何错误,但是在调试模式下我会这样做,所以它是__FILE__和__LINE__位,但我无法弄清楚实际问题是什么。
答案 0 :(得分:3)
__LINE__
宏计算为整数。 _T
宏在字符串的前面放置L
以使其成为Unicode字符串。它的意思是后跟一个开头的双引号,如L"file.cpp"
。但在你的情况下,它后跟__LINE__
扩展为的整数文字。你得到的是这样的东西:L23
。摆脱第二次_T
电话。
#define EXCEPTION(msg, mm) Exception(msg, mm, _T(__FILE__), __LINE__)
如果您包含了编译器无法识别的标识符的名称,则可能更容易诊断出来。编译器通常在错误消息中包含该信息。
答案 1 :(得分:2)
这与我的问题不完全相同,但是我在这里发布了我的问题的解决方案,因为我在调查过程中遇到了这个问题。
如果您在使用多线宏时遇到此错误消息,请在编辑器中启用可见空格。在行尾的'\'连续符后面可能有空格:
#define FOO_BAR(aFoo) \
FOO_BASE(aFoo, "bar")
最后的空格导致解析器将宏定义的第一行解析为完整(FOO_BAR扩展为'\'),第二行被解释为函数声明,因此“未声明的标识符'aFoo'” )。