gpt4 book ai didi

c++ - try/catch 宏后的这个分号有什么作用?

转载 作者:搜寻专家 更新时间:2023-10-30 23:55:03 29 4
gpt4 key购买 nike

我正在看一些项目

    PREPAID_TRY ;

在别处被定义为

#define PREPAID_TRY try {

我认为通过使用上面的;,程序员基本上取消了try的使用?尝试不再生效,对吗?

但在它下面有这样的代码 - 我想知道当它之前没有 try 时它是如何编译的?

PREPAID_CATCH_WITH_LOG(pErrInfo, "(Connect)") ;

定义为

#define PREPAID_CATCH_WITH_LOG(x,t) } \
catch (const dErrorStruct& ex) {ex.FillErrorStruct(x);Log.LogPrintf(t ## " - %s", x->Description);}

当程序员在第一个try 中使用; 时,为什么上面的代码可以编译?上面的 catch 前面没有 try,对吗?

最佳答案

假设你有

#define PREPAID_TRY try {
#define PREPAID_CATCH_WITH_LOG(x,t) } \
catch (const dErrorStruct& ex) {ex.FillErrorStruct(x);Log.LogPrintf(t ## " - %s", x->Description);}

然后你编写如下代码

PREPAID_TRY;
SomeFunction();
PREPAID_CATCH_WITH_LOG(pErrInfo, "(Connect)");

如果你自己伪装成预编译器,你可以填写宏定义,并在重新格式化后检查编译器是否看到以下代码:

try { 
; // Empty statement
SomeFunction(); // Your original code is still part of the try
} // Note this brace is part of PREPAID_CATCH_WITH_LOG
catch (const dErrorStruct& ex) {
ex.FillErrorStruct(pErrInfo);
Log.LogPrintf("(Connect)" " - %s", pErrInfo->Description); // Note compile-time string concatenation
}

这给出了一个有效的 try/catch block 。里面有一个空语句 (;),但是由于编写的宏可以让您获得一组正确的大括号,所以这不是问题。另请注意,CATCH 宏负责处理 try 构造的右大括号。

实际上 PREPAID_TRY 之后的分号可以省略,这将去掉最终代码中不必要的空语句,但包含它会使该行本身看起来更像是一个语句,它很可能编写它的程序员甚至没有注意到他把它放在那里(我有时发现自己在写了一整天的 C++ 或 C# 之后在常规文本中放置分号)。

当您说“取消 try block ”时,您可能会想到如下内容:

#define PREPAID_TRY if(not_out_of_memory())
#define PREPAID_CATCH_WITH_LOG(x,t) \
else { raise_out_of_memory_exception(); }

请注意,我必须将 try 替换为 if 语句,因为首先不使用大括号的 try 是非法的(例如 try SomeFunction() catch { ... } 是不允许的),但是对于 if(...) { SomeFunction(); 中的大括号 是可选的,如果你只调用一个函数。这导致

if(not_out_of_memory())
;
SomeFunction();
else { raise_out_of_memory_exception(); }

我将原始 SomeFunction 代码向左缩进,以指示编译器如何解析它。这确实会导致编译器错误,因为当编译器到达 else 时,不再有事件的 if 语句。正确使用此宏的唯一方法是包含您自己的大括号:

PREPAID_TRY {
SomeFunction();
;;;;;; // Now you can put as many semicolons here as you like.
}
PREPAID_CATCH_WITH_LOG(...)

关于c++ - try/catch 宏后的这个分号有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33889187/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com