如何使 Visual Studio 2010 警告未使用的变量


#include <string>
using namespace std;
int main()
{
    string s; // no warning
    int i;    // warning C4101
    return 0;
}
  1. 为什么Visual Studio警告我未使用的变量i而不是示例中的s
  2. 我假设编译器不确定字符串构造函数的副作用。这是不显示警告的原因吗?
  3. 我可以以某种方式启用有关未使用的字符串变量的警告吗?

我的警告级别设置为 4。

我假设编译器只警告未使用的变量,用于平凡的可构造/可破坏类型。

template<typename>
struct Empty
{
};
template<typename T>
struct Trivial : Empty<T>
{
    int* p;
    int i;
};
template<typename>
struct NonTrivial
{
    NonTrivial() {}
};
template<typename>
struct TrivialE
{
    TrivialE& operator=(const TrivialE&) {}
};
struct NonTrivial2
{
    NonTrivial2() {}
};
struct NonTrivialD
{
    ~NonTrivialD() {}
};
int main()
{
    Empty<int> e;      // warning
    Trivial<int> t;    // warning
    NonTrivial<int> n; // OK
    TrivialE<int> te;  // warning
    NonTrivial2 n2;    // OK
    NonTrivialD nd;    // OK
}

编译器处理比较

可以看出,它们是一致的。

由于std::string不可能是微不足道的可破坏的,因此编译器不会对此发出警告。

所以回答你的问题:你不能。

没有警告,因为实际上没有未使用的变量ssstring 类的一个实例,这个类有一个构造函数,该构造函数在声明string s;调用,因此s由它的构造函数使用。

std::string不是

基元类型,而int是。非基元类型具有构造函数和析构函数,它们可以执行一些有用的功能:内存管理、输出到屏幕等,因此声明非基元类型并不一定意味着不使用变量。 当然,string不会做这样的事情,但可能它们会抑制对已知类型的警告,同时考虑到您可能会想出重新细化string行为的想法(您可以通过编辑一些头文件来做到这一点,因为string是基于模板类的(。

最新更新