C预处理器和if-else条件语句

时间:2010-06-22 02:24:47

标签: c++ visual-studio-2010 if-statement c-preprocessor

我在vs2010(win32控制台应用程序)中运行 C 代码。它被编译为C ++应用程序。

#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,但代码仍然编译失败。我的代码出了什么问题?

4 个答案:

答案 0 :(得分: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和else之间生成两个语句,因此编译错误随之而来。我怀疑由于

而添加{}时会出现不同的编译器错误
if (isEven(17) == YES)

成为

if (isEven(17) == 1;)

顺便说一句,这个问题标记为c,但您的文件名为.cpp,这是c ++的常见后缀。如果您使用的是c ++,请务必使用bool类型。

bool is_even = true;
bool is_odd = false;

答案 1 :(得分:2)

首先,从定义

的末尾删除分号
#define     YES     1
#define     NO      0

答案 2 :(得分:2)

正如其他用户所提到的,删除分号应该可以解决您手头的问题。 但是,我认为在编写宏时要指出一些你应该注意的事情可能很方便。

虽然有时很方便,但要注意在C中使用宏的缺陷是很好的。

1)这里没有明确的类型转换。

即'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'。这告诉编译器它是无符号的。

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

答案 3 :(得分: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;
}

虽然放置分号没有任何问题,但在这种情况下你可能想要的是删除分号,然后语句将成为你想要的。