当能宏使代码更漂亮比的功能呢? [关闭](When could macro make code

2019-10-17 02:18发布

没错,宏是没有必要的编程语言。 例如,无渣宏的工作相当精细。 通常宏使代码更清晰和更短,同时,更危险。

那么,什么是使用宏的最好方法? 让我们在代码中交谈。

Answer 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着色语言)循环展开一次使用升压预处理器套件,那么可以使用类似

const char *shader = "#version 120\n"
"..."
GLSL_UNROLL_FOR("int i",0,10,\
    "foo += i\n" \
)
"...";


Answer 2:

随着宏,你可以写这样的问题,因为这美丽的解决方案:

  • 限定一个枚举,使得它的值可被转化成它的字符串表示,反之亦然。

假设你要定义一个枚举叫做period ,其成员都是onefivetenfifteenthirty 。 那么这里是你怎么做:

  • 首先创建一个名为头文件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_stringto_period会工作得很好,没有任何修饰!

-

我把从我解决了另一个问题,这里发布此解决方案:

  • 从枚举转换为int


Answer 3:

我认为最好的方法是使用inline

你得到的宏的所有益处+所有编译时检查

初级事宏是在C ++有用是用于控制编译。 就像是:

#ifdef DEBUG:
    //print some debug information
#endif

要么

#ifdef OS_WINDOWS
    //windows specific code
#


Answer 4:

在我非常个人认为,一个良好的宏观是非常罕见的事情。 我尝试aviod他们尽可能多的,因为他们大多都更像是一个定时炸弹。

要善于,宏必须:

  • 很简单。
  • 永远是暧昧
  • 从不制动的码结构(I见过像宏#define MACRO } someCode { ,其吸入)
  • 无法抛出异常,或类似的东西,基本上,它绝不能做出调试更难
  • 有一个清楚的解释含义的名字
  • 必须有一个很好的理由来使用宏来代替,比如说,内联函数,编译一样控制,或头守着。


Answer 5:

下面是一个例子(易于维护)。

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
}


文章来源: When could macro make code more beautiful than function does? [closed]
标签: c++ c macros