gpt4 book ai didi

将在该 block 之后执行一段代码和特定命令的 C++ MACRO

转载 作者:太空狗 更新时间:2023-10-29 23:42:39 25 4
gpt4 key购买 nike

void main()
{
int xyz = 123; // original value
{ // code block starts
xyz++;
if(xyz < 1000)
xyz = 1;
} // code block ends
int original_value = xyz; // should be 123
}

void main()
{
int xyz = 123; // original value
MACRO_NAME(xyz = 123) // the macro takes the code code that should be executed at the end of the block.
{ // code block starts
xyz++;
if(xyz < 1000)
xyz = 1;
} // code block ends << how to make the macro execute the "xyz = 123" statement?
int original_value = xyz; // should be 123
}

只有第一个 main() 有效。
我认为评论解释了这个问题。

它不需要是一个宏,但对我来说这听起来像是一个经典的“需要宏”的案例。

顺便说一句,这里有 BOOST_FOREACH 宏/库,我认为它做的事情与我试图实现的完全相同,但它太复杂了,我无法找到我需要的本质。
从它的介绍手册页,一个例子:

#include <string>
#include <iostream>
#include <boost/foreach.hpp>

int main()
{
std::string hello( "Hello, world!" );

BOOST_FOREACH( char ch, hello )
{
std::cout << ch;
}

return 0;
}

最佳答案

最简洁的方法可能是使用 RAII 容器来重置值:

// Assumes T's assignment does not throw
template <typename T> struct ResetValue
{
ResetValue(T& o, T v) : object_(o), value_(v) { }
~ResetValue() { object_ = value_; }

T& object_;
T value_;
};

用作:

{
ResetValue<int> resetter(xyz, 123);
// ...
}

当 block 结束时,将调用析构函数,将对象重置为指定值。

如果您真的想使用宏,只要它是一个相对简单的表达式,您可以使用 for block 来实现:

for (bool b = false; b == false; b = true, (xyz = 123))
{
// ...
}

可以变成宏:

#define DO_AFTER_BLOCK(expr) \
for (bool DO_AFTER_BLOCK_FLAG = false; \
DO_AFTER_BLOCK_FLAG == false; \
DO_AFTER_BLOCK_FLAG = true, (expr))

用作:

DO_AFTER_BLOCK(xyz = 123)
{
// ...
}

我真的不认为宏观方法是个好主意;如果我在生产源代码中看到这一点,我可能会感到困惑。

关于将在该 block 之后执行一段代码和特定命令的 C++ MACRO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2985943/

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