在this example和几个相关页面中,Boost似乎直接在const char数组上使用流插入运算符(<<<<<<<<<<<<对象)。
BOOST_TEST_INFO("With parameter j = " << j);
有或没有&#39; BOOST_TEST_INFO&#39;或其他宏,我一直得到预期的编译器错误
error: invalid operands of type const char[#] and int to binary operator<<
在Boost标题中有一个名为basic_cstring.hpp的文件我认为是相关的,但它没有明确地包含在示例中(并且包含来自我的源代码似乎没有什么区别) 。)我错过了什么?
编辑 - 当且仅当在预处理期间发现周围的宏时,才选择流插入运算符;否则,第一个错误是红色鲱鱼&#34;无效运算符...到二元运算符&#34;。向BOOST_TEST_MESSAGE提供完全相同的行成功,但没有声明BOOST_TEST_INFO,BOOST_TEST_CONTEXT等,这是一个单独的问题(据我所知)。
答案 0 :(得分:6)
宏扩展为SOMETHING << "With parameter j = " << j
,因此它不会在字符串文字中插入任何内容,只需cout << 1 << 2
将2
插入1
。
答案 1 :(得分:3)
很容易看到预处理输出 - 这有助于理解它。例如,使用以下代码剪切:
#define CHECK(x) std::cout << x
CHECK("Oh" << "My" << "Gott" << 42 << "!");
并在&#39;输出预处理代码中运行编译器&#39;模式(通常-E
切换)。您将看到以下内容:
~>g++ -E cc.cpp
# 1 "cc.cpp"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "cc.cpp"
std::cout << "Oh" << "My" << "Gott" << 42 << "!";
这很清楚,不是吗?