C++编译器在第一次使用本地变量时可能未初始化发出警告。然而,有时候我知道这个变量在使用前总是会被写入,所以我不需要初始化它。当我这样做时,编译器会发出一个警告。由于我的团队正在使用
那么,有没有一种平台无关、编译器无关的方法来告诉编译器一个本地变量不需要初始化呢?
以下是可能触发此类警告的示例代码:
-Werror
编译,代码将无法编译。如何关闭特定本地变量的此警告?以下是我的限制:
- 我不允许更改编译器标志。
- 解决方案必须适用于所有编译器(即没有gnu扩展或其他编译器特定属性)。
- 我只想在特定本地变量上使用此功能。其他未初始化的本地变量仍应触发警告。
- 解决方案不应生成任何指令。
- 我不能更改本地变量的类。也就是说,我不能简单地添加“什么也不做”的构造函数。
那么,有没有一种平台无关、编译器无关的方法来告诉编译器一个本地变量不需要初始化呢?
以下是可能触发此类警告的示例代码:
void foo(){
T t;
for(int i = 0; i < 100; i++){
if (i == 0) t = ...;
if (i == 1) doSomethingWith(t);
}
}
如您所见,第一循环周期初始化了t,第二个循环周期使用了它,因此t永远不会被未初始化的情况下读取。然而,编译器无法推断这一点,因此会发出警告。请注意,为了简洁起见,此代码相当简化。
HeavyClass obj(kFlagNone)
。 - Raxvant
,然后让循环从1
而不是0
开始? - Frédéric HamidiData<T> t
的t
,其中Data
是template <class T>struct Data { T value; Data(){} };
,并使用t.value
而不是t
。这似乎可以消除 Visual Studio 上的警告。 - Raxvan