我在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
,但代码仍然编译失败。我的代码出了什么问题?
答案 0 :(得分:6)
编译错误是由#define
语句中的分号引起的。删除它们。
#define
是预处理器宏,而不是c语法。它不需要分号。预处理器在YES
和NO
上进行直接替换,这使得:
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;
}
虽然放置分号没有任何问题,但在这种情况下你可能想要的是删除分号,然后语句将成为你想要的。