gpt4 book ai didi

带有开始和结束标签的 C 宏?

转载 作者:太空宇宙 更新时间:2023-11-04 03:00:50 24 4
gpt4 key购买 nike

我刚开始阅读 this article关于在 c 中使用 setjmp(jmp_buf) 和 longjmp(jmp_buf, int) 进行异常处理。所以我基本上构建了使用 xRecord 类型的局部变量的链表并将其链接到列表。 (示例 2)它工作得很好。但在示例 3 中,步骤被总结为宏(XTRY 和 XEND)。最让我恼火的是示例 2 的实际 switch 语句在示例 3 中“消失”了。

示例 2:

   #define DIVIDE_BY_ZERO -3
int SomeFunction(int a, int b)
{
if (b == 0) // can't divide by 0
XRaise(DIVIDE_BY_ZERO);
return a / b;
}

void main(void)
{
XRecord XData;
XLinkExceptionRecord(&XData);
switch (setjmp(XData.Context))
{
case 0: // this is the code block
{
int Result = SomeFunction(7, 0);
// continue working with Result
}
break;
case DIVIDE_BY_ZERO:
printf("a division by zero occurred\n");
break;
default:
printf("some other error occurred\n");
break;
case XFINALLY:
printf("cleaning up\n");
}
XUnLinkExceptionRecord(&XData);
}

示例 3:

void main(void)
{
XTRY
case XCODE: // this is the code block
{
int Result = SomeFunction(7, 0);
// continue working with Result
}
break;
case DIVIDE_BY_ZERO: // handler for a
specific exception
printf("a division by zero occurred\n");
break;
default: // default handler
printf("some other error occurred\n");
break;
case XFINALLY: // finally handler
printf("cleaning up\n");
XEND
}

我的问题是,如何构建这些“打开和关闭”宏?

最佳答案

如果比较这两个示例,请记住 C 宏是简单的文本替换,那么宏应该是什么是显而易见的:

#define XTRY  XRecord XData; \
XLinkExceptionRecord(&XData); \
switch (setjmp(XData.Context)) \
{

#define XEND } \
XUnLinkExceptionRecord(&XData);

请注意使用 \ 允许宏跨越多行。

您可能还想让宏打开和关闭一个新范围(通过添加 {}),这样连续使用多个宏就不会由于变量 XData 的多个定义而给出错误。您还可以使用 do / while(0) trick允许将这些宏直接放置在 iffor 等内部,不会出现问题。

关于带有开始和结束标签的 C 宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12340088/

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