2016-01-13 53 views
-1
#include <iostream> 
#define CONCATENATE t; Box(); t 
#define END ; 
using namespace std; 

class Box 
{ 
public: 
     Box(){ } 
     Box(string _txt){ } 
     Box operator|(const Box& b) 
     { 
     cout<<"hi from op |"<<endl; 
     Box box; 
     return box; 
     } 
     void operator+() 
     { 

     } 
public: 
     string str; 
}; 

int main() 
{ 
    Box t; 
    Box tt; 

    CONCATENATE //this works 
    CONCATENATE CONCATENATE //this doesn't work because cant understand tt object 
    END 
} 

如果我给CONCATENATE CONCATENATE编译器说分号缺少多数正确但编译器应该理解t;框(); TT;框();因为在分析阶段删除空格。好奇的类对象连接C++

如果我编写CONCATENATE END编译器执行那个并且是正确的 t;框();吨; 如果我编写CONCATENATE CONCATENATE END编译器执行那个并且不正确 t;框(); t t;框();吨;因为了解分号丢失,但在这种情况下,我希望编译器明白应该执行对象tt并忽略空格。

我该怎么做那些家伙?

  • 更新

    预处理器连接了字符串到TT;目的?

    int main(){ 
        Box t; 
        Box tt; 
    
        //this work (is such 2 times CONCATENATE macro) 
        t; Box(); tt; Box(); t END 
        //this doesnt work 
        CONCATENATE CONCATENATE END 
    
    } 
    
+6

你究竟想在这里实现什么? [这几乎肯定是错误的做法。](http://meta.stackexchange.com/q/66377/242291) – BoBTFish

+0

检查我的update.thanks! –

+2

@ jay_gr13你的更新仍不能很好地解释你对这个构造的用例。对我来说毫无意义。 –

回答

1

至于你“更新”

预处理器连接了字符串到TT;目的?

不,预处理器不会连接任何东西,除非您用## string concatenation preprocessing operation指示它。我做简单的文本替换,所以让我们来查找您更换从预处理:

//this work (is such 2 times CONCATENATE macro) 
t; Box(); tt; Box(); t END 
//this doesnt work 
CONCATENATE CONCATENATE END 

将扩大到

//this work (is such 2 times CONCATENATE macro) 
t; Box(); tt; Box(); t ; 
//this doesnt work 
t; Box(); t t; Box(); t ; 

t t;不被视为有效语法。你的假设将连接到tt是错误的。

+0

你已经抓住了我想要的..有可能做出一些解决它? –

+0

@ jay_gr13恐怕不行,除非你引入另一个宏,它带两个参数,并使用前面提到的['##'concatenation](https://gcc.gnu.org/onlinedocs/cpp/Concatenation.html)运算符。 –