C++ 检测初始化变量
有没有办法检查某个变量是否在程序中某个点之前初始化 例如,如何检查某个变量是否在C++ 检测初始化变量,c++,initialization,C++,Initialization,有没有办法检查某个变量是否在程序中某个点之前初始化 例如,如何检查某个变量是否在IfStmt节点之前的某个位置初始化? 由于以下情况,来自VarDecl类(hasInit()和getInit())的方法是不够的: int x = 0; // hasInit() return true int y; ... y = 0; // initialized here, but hasInit() returns false ... if (...) {} 如果您维护一个C++代码编写的产品,并希望删
IfStmt
节点之前的某个位置初始化?
由于以下情况,来自VarDecl
类(hasInit()
和getInit()
)的方法是不够的:
int x = 0; // hasInit() return true
int y;
...
y = 0; // initialized here, but hasInit() returns false
...
if (...) {}
如果您维护一个C++代码编写的产品,并希望删除难看的不确定变量,一个合理的方法是定义一个初始化函数或lambda <代码> f>代码>,然后声明一个局部变量为<代码> const AutoX*F(…);代码>从一开始
Oto,如果您故意将值延迟为指定值,,有几种方法可以检测值是否已指定。 我刚刚想出了以下方法std::可选 在C++17及以上版本中,
std::optional
使我们能够检测是否分配了值。
std::optional::has_value
和std::optional::value
分别对应于您的hasInit
和getInit
,如下所示:
std::pair 我们还可以应用
std::pair
,其中std::pair::first
和std::pair::second
分别对应于您的hasInit
和getInit
。
我们再次得到之前的输出:
#包括
#包括
模板
无效检查初始化(const std::pair&a)
{
如果(a.first){
std::cout首先如评论中所述:
int y = 0; // initialization
int y; y = 0; // assignment
假设要检测赋值。一种简单的方法是将要跟踪的整数包装到结构中,然后编写一个自定义的运算符=(int)
。例如:
struct Foo
{
Foo() {std::cout << "default init" << std::endl;}
Foo& operator = (int elem)
{
cout<<"Int-Assignment operator called "<<endl;
x = elem;
is_assigned = true;
return *this;
}
int x = 0; // default initialized to 0
bool is_assigned = false; // default initialized to false
};
如果需要的话,你可以使用类似这样的东西或变体
这就是你想要的吗?< / P >你使用什么语言?你应用于这个问题的标签涉及编译器的问题,你的问题是关于语言。是C还是C++?(这是两种非常不同的语言)它是C++编程语言。<代码> y=0;//初始化在这里< /Cord>这不是初始化。这是赋值。初始化只能作为变量声明的一部分来完成(即<代码> int y=0;< /COD>)。
#include <iostream>
#include <utility>
template<typename T>
void checkInitialization(const std::pair<bool, T>& a)
{
if(a.first){
std::cout << "Value is assigned by " << a.second << "." << std::endl;
}
else{
std::cout << "Value is still not assigned." << std::endl;
}
}
int main(void)
{
std::pair<bool, int> x{false, 0};
checkInitialization(x); // Uninitialized
x = {true, 1};
checkInitialization(x); // Initialized
return 0;
}
int y = 0; // initialization
int y; y = 0; // assignment
struct Foo
{
Foo() {std::cout << "default init" << std::endl;}
Foo& operator = (int elem)
{
cout<<"Int-Assignment operator called "<<endl;
x = elem;
is_assigned = true;
return *this;
}
int x = 0; // default initialized to 0
bool is_assigned = false; // default initialized to false
};
int main()
{
Foo t1;
// t1.is_assigned is false
t1 = 0;
// t1.is_assigned is true
return 0;
}