2010-06-22 65 views
3

我在vs2010(win32控制檯應用程序)中運行我的C代碼。它被編譯爲C++應用程序。C預處理器和if-else條件語句

#include "stdafx.h" 

#define  YES  1; 
#define  NO  0; 

// function to determine if an integer is even 
int isEven(int number) 
{ 
    int answer; 

    if (number % 2 == 0) 
     answer = YES; 
    else 
     answer = NO;  
    return answer; 

} 

int main() 
{ 
    int isEven(int number); 

    if (isEven(17) == YES) 
     printf("yes "); 
    else 
     printf("no "); 


    if (isEven(20) == YES) 
     printf("yes\n"); 
    else 
     printf("no\n"); 

    return 0; 
} 

編譯錯誤如下。

p300.cpp(18): error C2181: illegal else without matching if 
p300.cpp(30): error C2143: syntax error : missing ')' before ';' 
p300.cpp(30): error C2059: syntax error : ')' 
p300.cpp(31): warning C4390: ';' : empty controlled statement found; is this the intent? 
p300.cpp(33): error C2181: illegal else without matching if 
p300.cpp(37): error C2143: syntax error : missing ')' before ';' 
p300.cpp(37): error C2059: syntax error : ')' 
p300.cpp(38): warning C4390: ';' : empty controlled statement found; is this the intent? 
p300.cpp(40): error C2181: illegal else without matching if 

然後,我還試圖插入幾個{ }每個if-else條件語句,但代碼仍然編譯時失敗。我的代碼有什麼問題?

+1

我想補充一點,你可以減少功能: INT ISEVEN(INT數){!返回(數& 1);} – Reinderien 2010-06-22 02:30:12

+1

@Reinderien好了,如果不使用他承認不必要的YES和NO定義'回報(編號: 1)?NO:YES;'雖然 – 2010-06-22 02:33:15

回答

6

編譯錯誤是由於#define語句中的分號造成的。刪除它們。

#define是一個預處理宏,而不是c語法。它不需要分號。預處理程序所做的YESNO直替代,這使得:

if (number % 2 == 0) 
    answer = YES; 
else 
    answer = NO; 

轉到:

if (number % 2 == 0) 
    answer = 1;; // <-- Notice the two semicolons! 
else 
    answer = 0;; 

這使得如果和其他人之間的兩種說法,所以編譯器錯誤接踵而至。我懷疑你會得到不同的編譯器錯誤當您添加{}由於

if (isEven(17) == YES) 

成爲

if (isEven(17) == 1;) 

順便說一句,這個問題被標記c,但你的文件名是.cpp,這是一種常見後綴爲C++。如果您使用的是C++,請確定使用bool類型。

bool is_even = true; 
bool is_odd = false; 
+1

+1有效,這就是你應該總是用括號括起宏表達式的原因(即#include YES(1)),爲什麼我總是將括號中的if/while/for語句括起來如果在條款中只有一條語句 – Akusete 2010-06-22 02:33:27

2

入手,從定義

#define  YES  1 
#define  NO  0 
1

無可厚非與放置分號在#define聲明的末尾刪除分號。它只是成爲宏的一部分。您定義

#define  YES  1; 

所以,你的主要功能變成這樣:

int main() 
{ 
    int isEven(int number); 

    if (isEven(17) == 1;) 
     printf("yes "); 
    else 
     printf("no "); 


    if (isEven(20) == 1;) 
     printf("yes\n"); 
    else 
     printf("no\n"); 

    return 0; 
} 

雖然沒有什麼錯放置一個分號,在這種情況下,你可能想要的是分號去掉,然後該聲明將成爲你想要的。

+0

雖然在#define中放置分號沒有任何問題,但是IMNSHO確實在braindead中將分號放在#define的end_結尾。 – ninjalj 2010-07-19 17:24:35

2

正如其他用戶所說,刪除分號應該可以解決您的問題。 但是,我認爲在編寫宏時應該注意一些其他的事情可能會很方便。

雖然有時很方便,這是好事,知道在C

1使用宏)這裏沒有明確的類型轉換的陷阱。

i。e'NO'可以是uint16_t或uint32_t。

您在上面的示例中將您的變量定義爲int。如果我們假設你是在一臺16位機器上,你的可變回答是16位長。但是,您尚未爲NO定義類型。在這種情況下,它不是什麼問題,因爲NO的值很小。但是,如果您將它與「答案」進行比較,那麼應該清楚回答的最大值應該是多少。 如果您嘗試將此代碼移植到32位計算機上,您也可能會遇到問題。

  • 類型轉換將幫助您實現代碼的可預測結果,並在編寫代碼時清楚地指明您的意圖。

    #define  YES  1 
    #define  NO  0 
    

    顯式類型轉換:

    #define  YES (uint16_t) 1 
    #define  NO (uint16_t) !(YES) 
    

    告訴編譯器做你想要什麼的另一種方式:

定義如下的良好做法如果你有號碼0xFFFF。取決於它是有符號還是無符號,這可能對您的編譯器有不同的含義。所以,如果你的目的是爲它是無符號,你可以明確地告訴編譯器把它的方式,通過執行以下操作:

#define MY_LARGE_CONSTANT 0xFFFFU 

注意「U」。這告訴編譯器它是無符號的。

我認爲這些都是很好的做法,編寫宏時應該牢記在心。它迫使你考慮你對常量使用的意圖。像這樣的習慣很早就發展起來,在你的職業生涯中肯定會走很長一段路。