2010-10-28 55 views
1

我是新手編程&我在閱讀本書時發現了這段代碼。我相信它給出了一個如何使用定義的assert()宏的例子。它不會在code :: blocks 10.05上編譯。我得到的錯誤,如使用一個簡單的assert()宏

  1. 「#」後面沒有在函數「廉政的main()」「斷言宏參數
  2. 未終止的#else
  3. 」在此範圍內未聲明

代碼:

#include<iostream> 
#define DEBUG 

#ifndef DEBUG 
#define ASSERT(x) 
#else 
#define ASSERT(x)\ 
if(!(x))\ 
{\ 
     cout<<"Error!!Assert"<<#x<<"failed\n";\ 
     cout<<"on line"<<__LINE__<<"\n";\ 
     cout<<"in file"<<__FILE__<<"\n";\ 
}\ 
#endif 

using namespace std; 

int main() 
{ 
    int x = 5; 
    cout<<"\nFirst assert."; 
    ASSERT(x==5); 
    cout<<"\nSecond assert."; 
    ASSERT(x!=5); 
    cout<<"\nDone."<<endl; 

    return 0; 
} 

任何幫助將不勝感激。提前致謝。

+1

你把一個空行之前 的#define ASSERT(X)\ 如果(!(x))\ ?如果你是嘗試取出空行。 – irrelephant 2010-10-28 01:40:37

+0

在用反斜槓結尾的宏定義行後面可能有空行。您必須將宏定義行保留在一起,並用反斜槓結束每行。 – 2010-10-28 01:40:58

回答

2
if(!(x))\ 
{\ 
     cout<<"Error!!Assert"<<#x<<"failed\n";\ 
     cout<<"on line"<<__LINE__<<"\n";\ 
     cout<<"in file"<<__FILE__<<"\n";\ 
} // no backslash 
+4

除非你的意思是'/ *沒有反斜槓* /',以防原始海報的代碼有像ASSERT(x)這樣的行; DoSomethingImportant();':-) – AlcubierreDrive 2010-10-28 01:55:13

+0

@Jon嗯,是的..有點棘手 – Anycorn 2010-10-28 02:02:36

+0

我沒有看到與評論的問題。你會遇到的問題是:if(x)ASSERT(y)else foobar(z);' – UncleBens 2010-10-28 07:06:21