确切地说,编程语言不需要宏。例如,没有宏,Java工作得很好。通常,宏使代码更清晰,更短,同时更危险。
那么,使用宏的最佳方法是什么? 让我们用代码谈谈。
答案 0 :(得分:5)
使用宏,您可以为这样的问题编写一个漂亮的解决方案:
假设您要定义一个名为period
的枚举,其成员为one
,five
,ten
,fifteen
和thirty
。那你就是这样做的:
首先创建一个名为period_items.h
的头文件:
//period_items.h
//Here goes the items of the enum
//it is not a definition in itself!
E(one)
E(five)
E(ten)
E(fifteen)
E(thirty)
然后创建另一个名为period.h
的头文件:
//period.h
#include <string>
//HERE goes the enum definition!
enum period
{
#define E(item) item,
#include "period_items.h" //it dumps the enum items in here!
#undef E
period_end
};
period to_period(std::string const & name)
{
#define E(item) if(name == #item) return item;
#include "period_items.h"
#undef E
return period_end;
}
现在您只需添加period.h
并使用to_period
功能即可。 : - )
您还可以将此功能添加到period.h
:
std::string to_string(period value)
{
#define E(item) if(value == item) return #item;
#include "period_items.h"
#undef E
return "<error>";
}
现在,你可以这样写:
#include "period.h"
period v = to_period("fifteen"); //string to period
std::string s = to_string(v); //period to string
为什么这个解决方案很漂亮?
因为现在如果您想在枚举中添加更多成员,您只需将它们添加到period_items.h
:
//period_items.h
//Here goes the items of the enum
//it is not a definition in itself!
E(one)
E(five)
E(ten)
E(fifteen)
E(thirty)
E(fifty) //added item!
E(hundred) //added item!
E(thousand) //added item!
你已经完成了。 to_string
和to_period
可以正常使用,无需任何修改!
-
我从我的解决方案中解决了另一个问题,发布在这里:
答案 1 :(得分:3)
我认为最好的方法是使用inline
您可以获得宏+所有编译时间检查的所有好处
主要的东西宏在c ++中很有用,用于控制编译。类似的东西:
#ifdef DEBUG:
//print some debug information
#endif
或
#ifdef OS_WINDOWS
//windows specific code
#
答案 2 :(得分:1)
在我个人看来,一个好的宏是非常罕见的。我尽量避免使用它们,因为它们中的大多数更像是定时炸弹。
要做到好,宏必须:
#define MACRO } someCode {
这样糟糕的宏)答案 3 :(得分:1)
我只在没有其他功能的地方使用宏。
一个例子是从错误值到字符串的简单映射,例如代替
switch(code) {
case ERR_OK: return "ERR_OK";
case ERR_FOO: return "ERR_FOO";
:
我使用像
这样的简单宏#define CASE_STR(x) case x: return #x
所以我可以将其简化为
switch(code) {
CASE_STR(ERR_OK);
CASE_STR(ERR_FOO);
:
但是,这些情况通常更多用于调试。
另外,我编写了一个GLSL(OpenGL着色语言)循环,使用boost预处理器套件展开一次,然后可以使用类似
的东西。const char *shader = "#version 120\n"
"..."
GLSL_UNROLL_FOR("int i",0,10,\
"foo += i\n" \
)
"...";
答案 4 :(得分:1)
这是一个例子(可以轻松维护)。
enum id {
#define ITEM(id, s) id,
# include "foo.itm"
#undef ITEM
nbItem
};
static char const *const s[] = {
#define ITEM(id, s) s,
# include "foo.itm
#undef ITEM
}