我是C ++的新手,之前从未使用过宏,但我相信他们可以让我解决以下问题,尽管我会欢迎其他解决方案。
我写了以下宏:
#define COMMAND(NUMBER){ button_ ## NUMBER ## ->hide(); }
我希望像这样称呼它
for (int i = 1; i < 10; i++)
{
COMMAND(i)
}
希望当程序执行时,它将完成相同的操作:
button_1->hide();
button_2->hide();
button_3->hide();
button_4->hide();
.
.
button_10->hide();
我的想法是,我想根据加载表单时读入的配置文件动态显示/隐藏窗口小部件。
不幸的是,上面的宏看起来不起作用,而是它的作用
button_i->hide();
导致编译错误,因为button_i不存在!
所以我的问题是:
A)是否可以在C ++中执行此操作?
B)宏是否能够实现这一点?
C)如果不是什么可以?
D)如果宏可以做到这一点,那么我如何修改上面的代码实际上让它工作!
由于
答案 0 :(得分:1)
我很确定有一种方法可以让宏技巧发挥作用,但有更好的选择。
例如,您可以将按钮存储在数组中。
假设您的按钮有一个名为struct button
的类型,请按以下方式声明您的按钮:
struct button *buttons[42];
您需要像对各个button_X变量一样初始化所有这些变量。
button[i] = <whatever you do to create button number i>;
然后你就可以做到:
for (int i=0; i<42; i++) {
button[i]->hide();
}
或仅使用其编号切换任何单个按钮。从长远来看,你可能会发现比任何宏技巧更好。
(警告:数组基于0
,因此您的第一个按钮为button[0]
)
答案 1 :(得分:0)
如果您可以控制button_2
等变量,我建议您使用数组。这样你就可以使用:
for (int i = 1; i < 10; i++)
{
button[i]->hide();
}
当然,放在宏观中这是微不足道的。
一般情况下,在C中使用普通循环无法实现所需。但是,如果确实想要走这条路线,请查看boost预处理器包。
答案 2 :(得分:-1)
不要试图自己管理按钮,FLTK不喜欢这样。您将看到一组令人难以看见的令人敬畏的按钮。我不知道怎么做你想要的方式,但我会这样做:
Fl_Button * o = (Fl_Button *)myWindow->child(i);
o->hide();
并让按钮成为FLTK窗口的子项。