如何让 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;
}
- 为什么 Visual Studio 警告我关于未使用的变量
i
而不是关于示例中的 s
?
- 我假设编译器不确定字符串构造函数的副作用。这是不显示警告的原因吗?
- 我能否以某种方式启用有关未使用的字符串变量的警告?
我的警告级别设置为 4。
没有警告,因为实际上没有未使用的变量s
。 s
是 string
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
不可能被轻易破坏,编译器不会对此发出警告。
所以回答你的问题:你不能。
#include <string>
using namespace std;
int main()
{
string s; // no warning
int i; // warning C4101
return 0;
}
- 为什么 Visual Studio 警告我关于未使用的变量
i
而不是关于示例中的s
? - 我假设编译器不确定字符串构造函数的副作用。这是不显示警告的原因吗?
- 我能否以某种方式启用有关未使用的字符串变量的警告?
我的警告级别设置为 4。
没有警告,因为实际上没有未使用的变量s
。 s
是 string
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
不可能被轻易破坏,编译器不会对此发出警告。
所以回答你的问题:你不能。