如何在C语言中像Pascal语言的“with”一样实现?

3

一个更好的问题可能会描述你想要的内容,而不依赖于任何其他上下文。例如,自从 1990 年代初以来,我就没有编写过任何 Pascal 代码了。如果你不用它,就会失去它。然而,如果你实际告诉我们你想要的行为,而不是不同语言的结构,我仍然可能能够回答这个问题。 - jer
1
我的 Pascal 已经非常生疏了 - 你能解释一下 with 在那里的作用吗? - Björn Pollex
2
你不能这样做。(即使在Pascal中支持,这也是一种不好的做法。它会导致难以追踪的作用域问题,并使代码更难阅读和维护。) - Ken White
问题涉及到这种类型的结构:MyObj := SomeObject.Create; with MyObj do begin SomeProperty := AVal; BVal := SomeFunc(AVal); end;,如果没有 with,它将是 MyObj.SomeProperty := AVal; BVal := MyObj.SomeFunc(AVal);。这是一种在代码块中对对象实例进行简写访问的方式。 - Ken White
1
在许多软件开发人员看来,D编程语言是现代C++(及更多)的代表。与Pascal相同,D语言中也有with语句。我认为D语言版本的with语句甚至更好,因为它可以处理三种用例。更多信息请参见此处 - http://www.dlang.org/statement.html#WithStatement。 - DejanLekic
显示剩余2条评论
5个回答

4

你不能用C语言来实现这个功能。我认为在C++中也是如此(尽管可能有一些不人道的模板元编程实验 :-) )


哦...你让我想尝试一些基于三元运算符的技巧(请参见http://www.artima.com/cppsource/foreach.html) - Alexandre C.

3
如果必要的话,你可以使用一个辅助对象(指针)并进行“缩减”。
some_complicated_expression->a = 0;
some_complicated_expression->b = 42;

为了

{ /* new block to delimit scope of `tmp` */
    whatever *tmp = some_complicated_expression;
    tmp->a = 0;
    tmp->b = 42;
}

0
在C语言中,你无法这样做,因为没有这样的功能。你只能重复指针名称。

0

1
阅读了其他问题后,您如何得出答案是结构体?该单词仅出现在问题标签中。这意味着这是一个关于结构体的问题。 - Rob Kennedy
第二个链接仅提供:“C语言中没有等效于with的功能。” 这比输入链接文本更短!! 这个答案太奇怪了... - SO_fix_the_vote_sorting_bug

0

在C语言中,我认为你做不到。

只要你不试图在C++中编写Pascal代码,你可以使用对象来达到相同的效果。调用对象上执行所需工作的成员函数,就可以消除每个步骤中额外的ptr->


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接