C语言中的宏定义错误?

3
#define SOUND_SPEED 0.034;    
int rtt; //round trip time in microsecond
double distance;
distance = (double)(rtt*SOUND_SPEED)/2;

它报错了:在“/”标记之前期望表达式。是因为我不能使用宏定义小数或其他原因吗?

3
一个傻瓜错误 —— 我每隔几年 仍然 会犯一次 :( - Joseph Quinsey
可能是 C 中 #define 的奇怪错误 的重复问题。 - Gilles 'SO- stop being evil'
3个回答

9

去掉分号:

#define SOUND_SPEED 0.034; 
                         ^

如果您保留它,生成的代码将如下所示:
distance = (double)(rtt*SOUND_SPEED;)/2;
                                   ^

看预处理器输出会更加可信,例如:gcc -E foo.c - Arun

3

1
你正在使用C语言,但是尝试使用C++风格的//注释。根据你的编译器,可能不被允许。
编辑:事实上,gcc -c89 -ansi对于//注释会给出精确的错误消息,而对于定义中多余的;则会给出完全不同的错误消息。

从C99开始支持,但旧的编译器可能无法处理此代码。由于问题没有提及使用了哪个编译器,我认为值得一提。 - Joachim Isaksson
说实话,我甚至不知道有哪个C89编译器不支持它作为默认扩展名。 - ouah
@ouah 在90年代,Sun的C编译器曾经在此处出现错误,但我不确定当前是否有任何以C89模式运行的编译器会出现这种情况。但正如我所说,没有提到编译器是否是C89。 - Joachim Isaksson
我在我的Linux电脑上安装了Sun C编译器(SolarisStudio 12.2, with cc 5.0),并且进行了测试://被默认接受。 - ouah
1
@ouah A // 在gcc -c89 -ansi下的注释会导致错误,错误信息为“error: expected expression before ‘/’ token”,而在任何模式下,define中的分号会导致错误,错误信息为“error: expected ‘)’ before ‘;’ token”。该问题涉及到斜杠符号。 - Joachim Isaksson
啊,如果Kevin提供了更多的错误信息,比如发生在哪一行,那么这个问题就会更加明显。 - Jeff Mercado

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接