我在PC-Lint(au-misra-cpp.lnt)中收到此错误:
错误1960 :(注意 - 违反MISRA C ++ 2008要求规则5-2-12, 传递给期望指针的函数的数组类型
关于此代码:
_IDs["key"] = "value";
_ID声明为:
std::map<std::string,std::string> _IDs;
也尝试改为:
_IDs.insert("key","value");
但是得到同样的错误。
如何让代码符合Misra?
答案 0 :(得分:6)
违反的规则是调用std::string::string(const CharT* s,
const Allocator& alloc = Allocator())
,它将从char const []
衰减到字符指针。
我认为,解决方案是明确地转换为指针类型:
_IDs[static_cast<char const *>("key")] = static_cast<char const *>("value");
但是,我建议不要使用(或至少升级)在实际使用std::string
时发出警告的linter。
另请注意,您无法按照尝试方式拨打std::map::insert
。没有直接接受密钥和值的重载,而是存在一个由密钥和值组成的对的重载。请参阅here重载号码1。
答案 1 :(得分:3)
// a template function that takes an array of char
// and returns a std::string constructed from it
//
// This function safely 'converts' the array to a pointer
// to it's first element, just like the compiler would
// normally do, but this should avoid diagnostic messages
// from very restrictive lint settings that don't approve
// of passing arrays to functions that expect pointers.
template <typename T, size_t N>
std::string str( T (&arr)[N])
{
return std::string(&arr[0]);
}
使用上面的模板功能,你应该能够像这样过去:
_IDs[str("key")] = str("value");
顺便说一句 - 我很惊讶lint并没有抱怨_IDs
是一个保留名称 - 你应该避免在C或C ++中使用下划线,特别是与cap一起使用时。