c 中 #define 的奇怪错误
我知道#define 在编译为实际值之前被替换。那么为什么这里的第一个代码编译没有错误,而第二个代码却没有呢?
第一个;
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("bc");
return 0;
}
第二个(不工作);
#include <stdio.h>
#include <stdlib.h>
#define Str "bc";
int main()
{
printf(Str);
return 0;
}
error: expected ')' before ';' token
谢谢你的回答,对我糟糕的英语感到抱歉......
I know that #define replaced before the compiling to real values. so why the first code here compile with no error, and the 2nd not?
the 1st;
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("bc");
return 0;
}
the 2nd(not working);
#include <stdio.h>
#include <stdlib.h>
#define Str "bc";
int main()
{
printf(Str);
return 0;
}
error: expected ')' before ';' token
thank you for the answers, and sorry about my poor English...
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
因为
Str
宏的计算结果为"bc";
— 包含分号。所以你的宏扩展为:你不需要在 #define 后跟分号。它们以换行符结束,而不是像 C 语句那样以分号结束。我知道这很令人困惑; C 预处理器是一个奇怪的野兽,它是在人们了解之前就被发明的。
Because the
Str
macro evaluates to"bc";
— the semicolon is included. So your macro expands to:You do not need to follow a #define with a semicolon. They end at a newline, rather than at the semicolon like a C statement. It is confusing, I know; the C preprocessor is a strange beast and was invented before people knew better.
实际上,第二个有效,第一个无效。问题是分号:
Actually the second works and the first doesn't. The problem is the semicolon:
使用,它将如下所示:
替换后与您的定义一起
Use
with your define after the substitution it will look like:
第一个的问题是
Str
被替换为"bc";
。将其更改为
The problem with the first one is that
Str
is replaced with"bc";
.Change it to
您需要删除;你在哪里定义 str.因为你会得到 printf("bc";);
You need to remove ; where you define str. Because you will get printf("bc";);
第一个代码无法编译,因为您需要在 #define 之后删除分号,第二个代码才能正常工作。
The first code does not compile because you need to remove the semicolon after the #define the 2nd code works as it should.
第一个不起作用,因为这些行:
扩展到此行:
您想要:
The first one doesn't work because these lines:
expand to this line:
You want: