首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对于宏,我可以使用哪些技巧?

对于宏,我可以使用哪些技巧?
EN

Stack Overflow用户
提问于 2009-03-16 13:42:17
回答 25查看 15.7K关注 0票数 29

在我们的遗留代码以及现代代码中,我们使用宏来执行代码生成等出色的解决方案。我们同时使用###运算符。

我很好奇其他开发人员如何使用宏来做很酷的事情,如果他们真的使用宏的话。

EN

回答 25

Stack Overflow用户

回答已采纳

发布于 2009-03-16 14:40:22

在C语言中,通常会定义宏来获取逐字参数,同时定义函数来透明地获取它的地址。

代码语言:javascript
复制
// could evaluate at compile time if __builtin_sin gets
// special treatment by the compiler
#define sin(x) __builtin_sin(x)

// parentheses avoid substitution by the macro
double (sin)(double arg) {
    return sin(arg); // uses the macro
}

int main() {
    // uses the macro
    printf("%f\n", sin(3.14));

    // uses the function
    double (*x)(double) = &sin;

    // uses the function
    printf("%f\n", (sin)(3.14));
}
票数 30
EN

Stack Overflow用户

发布于 2009-03-16 14:44:58

还有X Macro惯用法,它对干式和简单的代码生成很有用:

在标题gen.x中使用not defined宏定义了一种表:

代码语言:javascript
复制
/** 1st arg is type , 2nd is field name , 3rd is initial value , 4th is help */
GENX( int , "y" , 1 , "number of ..." );
GENX( float , "z" , 6.3 , "this value sets ..." );
GENX( std::string , "name" , "myname" , "name of ..." );

然后他可以在不同的地方使用它,为每个#include定义一个通常不同的定义:

代码语言:javascript
复制
class X
{
public :

     void setDefaults()
     {
#define GENX( type , member , value , help )\
         member = value ;
#include "gen.x"
#undef GENX
     }

     void help( std::ostream & o )
     {
#define GENX( type , member , value , help )\
          o << #member << " : " << help << '\n' ;
#include "gen.x"
#undef GENX
     }

private :

#define GENX( type , member , value , help )\
     type member ;
#include "gen.x"
#undef GENX
}
票数 18
EN

Stack Overflow用户

发布于 2009-03-16 13:54:53

最酷的宏是: assert,include guards,__FILE__,__LINE__。

避免在代码中使用其他宏。

编辑:

只有在没有合法解决方案的情况下才使用宏。

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/650461

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档