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; 
}