我在尝试使用googletest中的std::array时遇到了此错误。以下是一个产生此错误的最小示例:
arr.cpp
#include "gtest/gtest.h"
#include <array>
TEST(Test, Positive) {
EXPECT_NO_THROW({
const std::array<unsigned char, 16> foo = {1, 2, 3};
});
}
int main(int argc, char **argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
我使用了来自Github的 current googletest代码。 使用 make 和 make install 命令安装googletest。
作为编译器,我在Ubuntu 14.04 LTS上使用了clang3.8。
使用以下命令:
clang++ -std=c++11 -o arr arr.cpp
结果如下:
arr.cpp:6:41: error: too many arguments provided to function-like macro invocation
const std::array<unsigned char, 16> blasdasd = {1, 2, 3};
^
/usr/local/include/gtest/gtest.h:1845:9: note: macro 'EXPECT_NO_THROW' defined here
#define EXPECT_NO_THROW(statement) \
^
arr.cpp:5:5: note: cannot use initializer list at the beginning of a macro argument
EXPECT_NO_THROW({
^ ~
arr.cpp:5:5: error: use of undeclared identifier 'EXPECT_NO_THROW'
EXPECT_NO_THROW({
^
2 errors generated.
移除 EXPECT_NO_THROW 宏并简单地声明数组可以编译通过。我是否遗漏了什么明显的东西,还是应该在 Github 上提交 bug 报告?
<,>
模板和模板参数内的逗号。这些逗号被解析为宏的多个参数。首先,使用using uchar_16_array = std::array<unsigned char, 16>
,并在宏中使用uchar_16_array
。我假设它会理解初始化列表(但不能保证)。 - Yakk - Adam NevraumontEXPECT_NO_THROW(( ... ));
这将把...
中的任何代码作为单个参数传递给宏。 - dyp;
结尾),因此在括号中包含语句当然不会直接起作用。但是,你可以将语句包装在 lambda 中,并将其放入括号中传递:EXPECT_NO_THROW(( [&]{ my_code; }() ));
- dyp-Wall -Wextra
一开始可能会有些麻烦,但它们可以使编译器输出关于程序意外后果的重要信息。 - dyp