加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

使用析构函数的C值表达式在Visual Studio 2010中生成警告C4701

发布时间:2020-12-16 06:54:25 所属栏目:百科 来源:网络整理
导读:以下C代码在Visual Studio 2010中编译时没有警告: extern void callFunc( int,int );struct str_wrapper{ str_wrapper();};extern bool tryParseInt( const str_wrapper str,int outValue );void test(){ int x,y; if ( tryParseInt( str_wrapper(),x ) try
以下C代码在Visual Studio 2010中编译时没有警告:

extern void callFunc( int,int );

struct str_wrapper
{
 str_wrapper();
};

extern bool tryParseInt( const str_wrapper& str,int& outValue );

void test()
{
 int x,y;
 if ( tryParseInt( str_wrapper(),x ) && tryParseInt( str_wrapper(),y ) )
 {
  // No warning generated
  callFunc( x,y );
 }
}

但是,如果str_wrapper具有用户定义的析构函数,则代码会在callFunc(x,y)行生成警告:

警告C4701:使用了未初始化的局部变量’y’.

extern void callFunc( int,int );

struct str_wrapper { str_wrapper(); ~str_wrapper(); ///< Causes warning C4701 below };

extern bool tryParseInt( const str_wrapper& str,int& outValue );

void test() { int x,y; if ( tryParseInt( str_wrapper(),y ) ) { // C4701 generated for following line callFunc( x,y ); } }

如果两个示例都生成警告,或者两个示例都没有生成警告,我会很高兴.我错过了一些不起眼的C规则,还是这是一个编译器错误?

解决方法

不幸的是,我无法使用提供的代码重现该警告.但是,我假设编译器因为短路评估语言功能而生成它.

X应始终在tryParseInt函数中“初始化”,但Y的“初始化”仅取决于先前tryParseInt(str_wrapper(),x)调用的布尔结果.但是,是的,为什么在if-block中为行生成警告仍然没有任何意义.也许编译器已经欺骗了自己?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读