没错,宏是没有必要的编程语言。 例如,无渣宏的工作相当精细。 通常宏使代码更清晰和更短,同时,更危险。
那么,什么是使用宏的最好方法? 让我们在代码中交谈。
没错,宏是没有必要的编程语言。 例如,无渣宏的工作相当精细。 通常宏使代码更清晰和更短,同时,更危险。
那么,什么是使用宏的最好方法? 让我们在代码中交谈。
我只有在没有其他作品的地方使用宏。
一个例子是具有从误差值到字符串容易映射,例如,而不是
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着色语言)循环展开一次使用升压预处理器套件,那么可以使用类似
const char *shader = "#version 120\n"
"..."
GLSL_UNROLL_FOR("int i",0,10,\
"foo += i\n" \
)
"...";
随着宏,你可以写这样的问题,因为这美丽的解决方案:
假设你要定义一个枚举叫做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
会工作得很好,没有任何修饰!
-
我把从我解决了另一个问题,这里发布此解决方案:
我认为最好的方法是使用inline
你得到的宏的所有益处+所有编译时检查
初级事宏是在C ++有用是用于控制编译。 就像是:
#ifdef DEBUG:
//print some debug information
#endif
要么
#ifdef OS_WINDOWS
//windows specific code
#
在我非常个人认为,一个良好的宏观是非常罕见的事情。 我尝试aviod他们尽可能多的,因为他们大多都更像是一个定时炸弹。
要善于,宏必须:
#define MACRO } someCode {
,其吸入) 下面是一个例子(易于维护)。
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
}