C++ 宏 - 字符串大写

6

我正在使用预处理器宏来声明一些重复的变量,具体来说:

QuitCallbackType quitCallback;
LossCallbackType lossCallback;
PauseCallbackType pauseCallback;
KeyCallbackType keyCallback;
MouseCallbackType mouseCallback;

我想使用预处理宏来完成这个任务,就像这样:

CREATE_CALLBACK_STORAGE(quit)
CREATE_CALLBACK_STORAGE(loss)
CREATE_CALLBACK_STORAGE(pause)
CREATE_CALLBACK_STORAGE(key)
CREATE_CALLBACK_STORAGE(mouse)

在 IT 技术中,这个词通常是这样使用的:

#define CREATE_CALLBACK_STORAGE(x) capitalize(x)##CallbackType x##CallBack;

有没有一种方法可以做到这一点,以便我不必传递每个名称的大写和小写版本?
我意识到使用宏并不能减少太多输入,但问题本身开始引起我的兴趣。

2
这样一个简单的命名方案使用宏似乎会更加令人困惑,不如有帮助。 - GManNickG
2个回答

5

宏预处理器无法截取子字符串或将字母大写。很抱歉。

如果您能更改命名方案,可能会取得更多成功。例如:

QuitCallbackType _QuitCallback;

编辑:我被警告不要使用前导下划线,但这个想法仍然适用:

QuitCallbackType callbackQuit;

1
对于备选方案加1。实际上,如果OP正在使用宏来定义变量,为什么不使用另一个宏来访问它们呢?比如说#define CALLBACK(x) _##x##Callback - casablanca
7
@Mark:以下划线开头,后跟大写字母的名称(例如您示例中的_QuitCallback)在实现中保留使用。这也适用于连续两个下划线的名称。顺便说一句,既然我在大约半小时前评论了你的另一个回答,我并不是在“关注”你。 :-) 在您编辑后,我将删除此评论。祝好! - Cheers and hth. - Alf
@Alf P. Steinbach:“顺便说一下,因为我大约半个小时前评论了你的另一个答案,所以我并不是在“关注”你。” Excusatio non petita, accusatio manifesta. ;) - Matteo Italia
@Matteo:当有人走在我前面,走的方向恰好和我一样时,我就会感到不舒服。干杯! - Cheers and hth. - Alf
@Alf:你并不孤单,这种情况经常发生在我身上。对于之前的评论,当然只是开玩笑。 :) - Matteo Italia
@Alf,我以为下划线的保留只有两个,而不是一个。我发现规则比我记得的要复杂:https://dev59.com/KHVC5IYBdhLWcg3woSxW - 再次感谢。 - Mark Ransom

2

我认为你应该完全放弃宏的想法。更好的解决方案是创建一个简单的数据结构,例如:

struct CallBacks {
  QuitCallbackType quit;
  LossCallbackType loss;
  PauseCallbackType pause;
  KeyCallbackType key;
  MouseCallbackType mouse;
};

请使用这个替代方法:

CallBacks callback;

您只能使用您需要的成员:

callback.quit = GetCallback(...);
someFunc(callback.quit);
// ect..

它还使变量名称(在我看来)更清晰。

使用联合体而不是结构体怎么样?当存储了所有数据成员但只有其中一个在任何给定时间被使用时,结构体会导致过多的浪费内存。 - Galaxy

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