c++ - 枚举 C++ 中的宏

标签 c++ macros

我需要这样写函数:

void foo()
{
    //some details
}
enum fun_names
{
    fun_name_foo,
};

所以我做了2个宏:

#define MAKE_FUN(fun) void fun(){}
#define ADD_FUN(fun) fun_name_##fun,

然后像这样使用它们:

MAKE_FUN(foo)
MAKE_FUN(bar)
enum fun_names
{
    ADD_FUN(foo)
    ADD_FUN(bar)
};

但如您所见,我重复了 2 个参数完全相同的宏。是否可以像这样制作一个宏?

CREATE_FUN(foo)
CREATE_FUN(bar)

这样可以节省代码行并且不易出错。

最佳答案

一个可能的技巧可能是让一个宏以宏名作为参数

#define DO_ENUM(Mac) \
  Mac(foo) \
  Mac(bar)

然后

#define DECLARE_ENUM(X) X,
enum fun_names {
  Nothing,
  DO_ENUM(DECLARE_ENUM)
};
#undef DECLARE_ENUM

并声明函数:

#define DECLARE_FUN(X) void myfun_##X(void);
DO_ENUM(DECLARE_FUN)
#undef DECLARE_FUN

等等。

另一种方法可能是生成一些专门的头文件,例如使用一些 awk 脚本,来自另一个包含函数列表等的文件。

关于c++ - 枚举 C++ 中的宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32794177/

相关文章:

c++ - 什么时候使用引用比指针更好?

javascript - JS : Can I call a function with same scope as caller or do macro-like behavior

C++:关于运行时警告错误和消息的最佳实践是什么?

c++ - CMake:根据 C 宏定义有选择地重新编译 C++ 程序模块

c++ - std::type_info::name() 的实际目的是什么?

visual-studio - 如何引用 .cpp 文件而不将它们包含在 Visual Studio 的解决方案中?

c++ - 链表删除和复制

c++ - 使用 ldap_get_next_page_s 进行 LDAP 排序会导致错误 LDAP_UNAVAILABLE_CRIT_EXTENSION

macros - 将循环重写为 mapcar

c - 具有相同名称的类似函数的宏和枚举器