2010-06-22 47 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”。这告诉编译器它是无符号的。

我认为这些都是很好的做法,编写宏时应该牢记在心。它迫使你考虑你对常量使用的意图。像这样的习惯很早就发展起来,在你的职业生涯中肯定会走很长一段路。