MSVC多行宏编译器错误
MSVC multiline macro Compiler errors
我在一个标头中定义了一个宏,该宏所基于的函数也在同一标头中。
这里有一个非常基本的例子,不是确切的代码,但希望它能足够说明这个问题:
myMacro.h:
#ifndef MYMACRO_H
#define MYMACRO_H
#ifdef _DEBUG
bool myAssertFn(int test, char const* desc, char const* file, int line) {
if (test != 0) {
//Test passes, no action required
return true;
}
std::string msg;
if (desc != nullptr) {
msg += "n Context: ";
msg += desc;
}
if (file != NULL) {
msg += "n File: ";
msg += file;
}
if (line > 0) {
msg += "n Line: ";
msg += std::to_string(line);
}
//Construct filename
time_t tClock = time(0);
char szTime[24];
tm tmNow;
//Get system time
localtime_s(&tmNow, &tClock);
//Assertion Log File, path and name
static const char* assertLogFile = "./ALF.log";
//Build time / date of day prefix
sprintf_s(szTime, sizeof(szTime), "%04d/%02d/%02d %02d:%02d:%02d "
, tmNow.tm_year + 1900, tmNow.tm_mon + 1, tmNow.tm_mday
, tmNow.tm_hour, tmNow.tm_min, tmNow.tm_sec);
//Does file exist?
std::ofstream logFile(assertLogFile, std::ios_base::app);
//Write the content to the file
logFile << szTime << msg.c_str() << std::endl;
return false;
}
//Macro
#define myAssert(test, desc)
myAssertFn((test), (desc), __FILE__, __LINE__)
#else
#define myAssert(test, desc)
(void)0
#endif
#endif
此宏的目的是包含调试信息,并替换标准断言函数,同时将结果记录到文件中。
问题是编译时我得到:
error C2065: 'test' : undeclared identifier
error C2065: 'desc' : undeclared identifier
在源文件中使用宏的其他错误:
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
error C2365: 'myAssertFn' : redefinition; previous definition was 'function' myAssert.h(37) : see declaration of 'myAssertFn'
error C2078: too many initializers
error C2143: syntax error : missing ';' before 'const'
在任何需要这个宏的源文件中,我只需包含标题并按如下方式使用宏:
myAssert(ptr != NULL, "ptr != NULL");
如果测试返回0,则说明将记录到带有日期、时间戳、文件名和故障发生的行号的文件中。
当您进行定义时,您有尾随字符:
#define myAssert(test, desc)
^^^^^^^^^^^^^^
这意味着反斜杠应用于空格,而不是末尾行,因此myAssertFn((test), (desc), __FILE__, __LINE__)
不再是宏的一部分。
源文件上的错误可能是因为您没有从头文件中删除定义,所以存在重新定义错误。
对于多行宏,字符必须是行上的最后一个字符。
即使是空白也会破坏多行宏,并且在行的末尾有多个空格。
相关文章:
- MSVC多行宏编译器错误
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++,我收到一个无法理解的编译器错误
- 我收到同义重复编译器错误。我应该如何修复"类型"X"的参数与类型"X"的参数不兼容?
- 重载方法的方式会在使用临时调用时生成编译器错误
- 尝试使用继承和模板实现CRTP.Visual Studio正在生成编译器错误
- 编译器错误:destuctor 的更宽松的抛出说明符
- Android NDK clang 编译器错误在 Windows 上显示'No such file or directory'
- C++ G++ 编译器 - 错误:隐式声明的定义
- 这个失败的测试是将零添加到空指针未定义的行为、编译器错误还是其他什么?
- 模板模板参数和模板别名:编译器错误?
- C++ 编译器错误:P1LinkedList.cpp:145:错误:重载的"to_string(int&)"调用不明确
- 在gcc中意外调用了Const重载.编译器错误或兼容性修复程序
- C1001内部编译器错误是由于矢量初始化(如数组)引起的
- 编译器错误(英特尔并行工作室 2019 与 Visual Studio 社区 2019)
- 如何在C++中克服此 C4430 编译器错误?
- 尝试使用 WinBGI 显示文本时出现编译器错误
- 使用typedef'ed返回类型声明友元函数时出现编译器错误
- 如何在类模板的成员函数中正确调用函数对象?正在生成 Visual Studio 编译器错误 C2440
- C++自定义分配器大小参数作为模板参数会引发编译器错误