2010-07-25 99 views
0

施坦格的错误,我已经改变了代码风格和ASLO我希望这将有助于 http://www.cs.bell-labs.com/cm/cs/pearls/spacemod.cpp与预处理宏

#include <iostream> 
using namespace std; 

#define MEASURE(T, text) 
{  \ 
    int i; 
cout<<text<<"\t";      \ 

cout<<sizeof(T)<<"\t";      \ 
int lastp=0;\ 
    for (i=0;i<11;i++){    \ 
     T *p=new T;         \ 
     int thisp=(int)p;         \ 
     if (lastp!=0) cout<<" "<<thisp-lastp;   \ 
     lastp=thisp;        \ 
    }                  \ 
    cout<<"n";\ 
    }              \ 
    using namespace std; 
template <class T> 
void measure(char *text) 
{ 
    cout<<"measure"<<text<<"\t"; 
    cout<<sizeof(T)<<"\n"; 
} 
int main(){ 



    return 0; 
} 

它只有一个错误

1>c:\users\david\documents\visual studio 2010\projects\measure\measure.cpp(5): error C2447: '{' : missing function header (old-style formal list?) 
+0

请参阅 http://www.cs.bell-labs.com/cm/cs/pearls/spacemod.cpp的[措施文本代码 – 2010-07-25 13:18:25

+0

可能重复从编程珍珠](http://stackoverflow.com/questions/3329142/measure-texts-code-from-programming-pearls) – interjay 2010-07-25 13:22:58

+1

@sbi:虽然这是正确的,在这种情况下,老问题的接受答案解决这里也表达了这个问题,所以我认为这个问题没有任何价值。事实上,看起来davit-datuashvili只是复制/粘贴给他的代码,然后由于一些奇怪的原因改变了反斜杠的位置,导致错误。 – interjay 2010-07-25 21:06:47

回答

9

我敢肯定你需要一个\#define行本身以及int i;的末尾,也可能是该宏中的空行(我不确定)。

我怀疑你的using声明之前的行上的\也是狡猾的。

但是,我绝对肯定的一件事是,使用内联函数比使用#define宏更好。

虽然inline保证它实际上内联,我倾向于始终离开优化到编译器。

和代码宏,我不赞成那个漂亮巨资C++,尤其是像这样:-)

0

你缺少宏观上的第一行续行符复杂的事情。您可以通过运行预处理器(例如,使用-G标志使用G ++)来查看您的宏扩展到的内容。

这就是说,我不明白为什么你应该首先需要一个宏。为什么不使用简单的模板功能?

0

好的,它是在#define之后的延续字符,正如你从prevoius回答中得到的那样。你应该尽量避免定义,这完全是因为它们会导致这样的错误,而这些错误并不意味着什么。 我认为你的确定义是为了提高性能,但有一个更好的方法可以做到这一点。将此函数定义为标题中的“内联”函数。你可以阅读更多关于例如这里的内联函数: