为啥 MSVC 在编译宏时大发雷霆,而 G++ 完全是关于禅的?
Posted
技术标签:
【中文标题】为啥 MSVC 在编译宏时大发雷霆,而 G++ 完全是关于禅的?【英文标题】:Why is MSVC throwing a tantrum compiling a macro while G++ is all about zen?为什么 MSVC 在编译宏时大发雷霆,而 G++ 完全是关于禅的? 【发布时间】:2009-10-11 00:14:51 【问题描述】:在 MSVC 9.0 下,这会失败。在 g++ 下编译。如果我们取出宏,那么非宏版本 76-79 编译。有什么想法吗?
03: #include <iostream>
04: #include <sstream>
67: #define MAKESTRING(msg, v) \
68: do \
69: std::ostringstream s; \
70: s << msg; \
71: v = s.str(); \
72: while(false)
73:
74: int main(void)
75:
76: std::ostringstream oss;
77: std::string str;
78: oss << "foo" << "bar";
79: str = oss.str();
80:
81: MAKESTRING("foo" << "bar", str);
82:
testenv.cpp(71) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
testenv.cpp(71) : error C2065: 's' : undeclared identifier
testenv.cpp(71) : error C2228: left of '.str' must have class/struct/union
1> type is ''unknown-type''
testenv.cpp(72) : error C2059: syntax error : ''
testenv.cpp(72) : error C2143: syntax error : missing ';' before ''
testenv.cpp(72) : error C2059: syntax error : ''
testenv.cpp(75) : error C2143: syntax error : missing ';' before ''
testenv.cpp(75) : error C2447: '' : missing function header (old-style formal list?)
testenv.cpp(81) : error C2017: illegal escape sequence
testenv.cpp(126) : fatal error C1004: unexpected end-of-file found
【问题讨论】:
【参考方案1】:我会确保在用于分隔宏行的反斜杠之后没有任何尾随空格。由于编译器报告的行号在您的宏定义中,这意味着预处理器并没有完全按照您的预期完成。
还可以尝试使用 MSVC /E
编译选项运行它,以查看预处理源的样子。
实际上,即使在您粘贴到问题中的源代码中,第 70 行也有一个尾随空格。:)
【讨论】:
不错的收获。猜猜 VC++ 在这方面更符合要求。 打开视图空白非常有用。 CTRLR CTRLW。设置颜色,使其可见但不会分散注意力。我在黑色背景上有一个深灰色。以上是关于为啥 MSVC 在编译宏时大发雷霆,而 G++ 完全是关于禅的?的主要内容,如果未能解决你的问题,请参考以下文章
为啥在 __assume 中使用函数调用时 MSVC 不报错?
如何在 Qt creator 中更改/配置所需的编译器?即在 MSVC/Mingw 或 g++/clang++ 之间切换