带点的预处理器宏?

时间:2013-04-26 00:38:07

标签: c++ macros

是否可以定义一个接受表达式的宏:object.method()?我想制作一个宏,将表达式改为......没有(有点删除它)。仅使用function(),我会这样做:#define function(没有任何值),但是可以创建一个带点的宏吗?

编辑:关于MooingDuck的评论:

object.Method("text", "other");

定义:

void Class::Method(std::string arg1, std::string arg2)
{
#if 0
    if (condition)
    {
        Method2(arg1, arg2);
    }
#endif
}

拆卸:

    object.Method("text", "other");
00394396  mov         edi,5  
0039439B  mov         eax,offset string "other" (396348h)  
003943A0  lea         esi,[ebp-4Ch]  
003943A3  mov         dword ptr [ebp-38h],0Fh  
003943AA  mov         dword ptr [ebp-3Ch],ebx  
003943AD  mov         byte ptr [ebp-4Ch],bl  
003943B0  call        std::basic_string<char,std::char_traits<char>,std::allocator<char> >::assign (393360h)  
003943B5  mov         dword ptr [ebp-4],1  
003943BC  mov         edi,4  
003943C1  mov         eax,offset string "text" (396350h)  
003943C6  lea         esi,[ebp-30h]  
003943C9  mov         dword ptr [ebp-1Ch],0Fh  
003943D0  mov         dword ptr [ebp-20h],ebx  
003943D3  mov         byte ptr [ebp-30h],bl  
003943D6  call        std::basic_string<char,std::char_traits<char>,std::allocator<char> >::assign (393360h)  
003943DB  mov         esi,10h  
003943E0  mov         dword ptr [ebp-4],0FFFFFFFFh  
003943E7  cmp         dword ptr [ebp-1Ch],esi  
003943EA  jb          main+0B9h (3943F9h)  
003943EC  mov         eax,dword ptr [ebp-30h]  
003943EF  push        eax  
003943F0  call        dword ptr [__imp_operator delete (3960ECh)]  
003943F6  add         esp,4  
003943F9  mov         edi,0Fh  
003943FE  mov         dword ptr [ebp-1Ch],edi  
00394401  mov         dword ptr [ebp-20h],ebx  
00394404  mov         byte ptr [ebp-30h],bl  
00394407  cmp         dword ptr [ebp-38h],esi  
0039440A  jb          main+0D9h (394419h)  
0039440C  mov         ecx,dword ptr [ebp-4Ch]  
0039440F  push        ecx  
00394410  call        dword ptr [__imp_operator delete (3960ECh)]  
00394416  add         esp,4  

2 个答案:

答案 0 :(得分:3)

您的代码是:

void Class::Method(const std::string& arg1, const std::string& arg2)
{
#if 0
    if (condition)
    {
        Method2(arg1, arg2);
    }
#endif
}

但问题是,当你用字符串文字调用它时,它仍在构造std::string个对象,因为构造它们的过程可能有副作用。

我想我会尝试这个,它不会在函数内部进行转换,因此编译器也可以忽略std::string构造。

template<class arg1_t, class arg2_t>
void Class::Method(const arg1_t& arg1, const arg2_t& arg2)
{
#if 0
    if (condition)
    {
        Method2(arg1, arg2);
    }
#endif
}

答案 1 :(得分:1)

宏的名称是标识符。没有办法。

不同的编译器可能允许不同的字符成为标识符(如$),但它们都不允许.。在一天结束时,C预处理器被设计成一个“光预处理器”,不像其他更强大的预处理器那样花哨的转换,它们存在于80年代中期。

虽然你可以做这样的事情(不是真的推荐):

struct DoNothing
{
    void method() { }
};

DoNothing g_inst;

#define object g_inst

几乎可以肯定,优化器会完全删除宏生成的代码。这种方法对所有使用的名称都很敏感。应该明确提到一切。