将函数标记为 const 的非候选函数
mark function as non-candidate for const
我有一个不会改变任何东西的函数。类似函数指针数组的函数指针部分,不能标记为 const,因为它不能成为该数组的一部分。
我有一个编译器标志处于活动状态,如果某个函数可能被声明为 const,它会警告我。这导致对该功能发出警告。
我将 g++-10 与 -Wsuggest-attribute=const 一起使用。
我查看了我可能可以使用的属性,但有 none 可以满足我的需要。
如何在保持其他函数的警告标志处于活动状态的同时抑制该函数的编译器警告?
#include <iostream>
#include <vector>
#include <string>
class C
{
public:
struct S
{
std::string fname;
void (C::*fptr)(void) = nullptr;
};
private:
std::vector<S> vec;
int data;
// can't be const, alters data -> can't update function pointer definition in struct
void f1();
void f2();
// -Wsuggest-attribute=const marks this as candidate
// but doing so will break assignment of vec
void f3();
public:
C() : data{0} {
vec = { {"inc", &C::f1}, {"dec", &C::f2}, {"nop", &C::f3} };
}
virtual ~C() { /* Empty */ }
int getData() const;
void exec(uint8_t opcode);
};
void C::f1() { data++; }
void C::f2() { data--; }
void C::f3() { return; }
int C::getData() const { return data; }
void C::exec(uint8_t opcode) { (this->*vec[opcode].fptr)(); }
int main()
{
C c;
c.exec(0);
std::cout << c.getData() << std::endl;
return 0;
}
我不知道为什么这个例子没有产生警告。但实际代码确实如此。
您可以使用 pragma 暂时禁用 gcc 和 clang 中的警告:
class C
{
// First save state of warnings
#pragma GCC diagnostic push
// Then ignore warning for this function
#pragma GCC diagnostic ignored "-Wsuggest-attribute=const"
void f3(){}
// Lastly restore warning state
#pragma GCC diagnostic pop
};
这也适用于 clang。还有一个变体可以用 msvc 做到这一点,但我不知道它。
我有一个不会改变任何东西的函数。类似函数指针数组的函数指针部分,不能标记为 const,因为它不能成为该数组的一部分。
我有一个编译器标志处于活动状态,如果某个函数可能被声明为 const,它会警告我。这导致对该功能发出警告。
我将 g++-10 与 -Wsuggest-attribute=const 一起使用。
我查看了我可能可以使用的属性,但有 none 可以满足我的需要。
如何在保持其他函数的警告标志处于活动状态的同时抑制该函数的编译器警告?
#include <iostream>
#include <vector>
#include <string>
class C
{
public:
struct S
{
std::string fname;
void (C::*fptr)(void) = nullptr;
};
private:
std::vector<S> vec;
int data;
// can't be const, alters data -> can't update function pointer definition in struct
void f1();
void f2();
// -Wsuggest-attribute=const marks this as candidate
// but doing so will break assignment of vec
void f3();
public:
C() : data{0} {
vec = { {"inc", &C::f1}, {"dec", &C::f2}, {"nop", &C::f3} };
}
virtual ~C() { /* Empty */ }
int getData() const;
void exec(uint8_t opcode);
};
void C::f1() { data++; }
void C::f2() { data--; }
void C::f3() { return; }
int C::getData() const { return data; }
void C::exec(uint8_t opcode) { (this->*vec[opcode].fptr)(); }
int main()
{
C c;
c.exec(0);
std::cout << c.getData() << std::endl;
return 0;
}
我不知道为什么这个例子没有产生警告。但实际代码确实如此。
您可以使用 pragma 暂时禁用 gcc 和 clang 中的警告:
class C
{
// First save state of warnings
#pragma GCC diagnostic push
// Then ignore warning for this function
#pragma GCC diagnostic ignored "-Wsuggest-attribute=const"
void f3(){}
// Lastly restore warning state
#pragma GCC diagnostic pop
};
这也适用于 clang。还有一个变体可以用 msvc 做到这一点,但我不知道它。