2010-07-25 185 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回答中得到的那樣。你應該儘量避免定義,這完全是因爲它們會導致這樣的錯誤,而這些錯誤並不意味着什麼。 我認爲你的確定義是爲了提高性能,但有一個更好的方法可以做到這一點。將此函數定義爲標題中的「內聯」函數。你可以閱讀更多關於例如這裏的內聯函數: