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

How to make Visual Studio 2010 warn about unused variables?

#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。

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

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

我假设编译器只会警告普通 constructible/destructible 类型的未使用变量。

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
}

Comparison of compilers' treatment

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

由于 std::string 不可能被轻易破坏,编译器不会对此发出警告。

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