编译器在number+;C语言中的宏
给出了以下代码:编译器在number+;C语言中的宏,c,macros,C,Macros,给出了以下代码: #define CELSIUS *10 void main() { int testVar=0; if(!testVar) testVar = 10CELSIUS; } 我的IDE给了我以下消息:常量“CELSIUS”有一个无效的后缀。但程序似乎是这样编译的。我必须关心这条消息吗?后缀是“在末尾添加的”。因此,当编译器抱怨整数常量末尾的后缀无效时,它会被单个标记打乱 因为它将内部的摄氏度识别为整数后缀。允许的后缀为(N1570§6.4.4.1/1): 这些
#define CELSIUS *10
void main()
{
int testVar=0;
if(!testVar) testVar = 10CELSIUS;
}
我的IDE给了我以下消息:常量“CELSIUS”有一个无效的后缀。但程序似乎是这样编译的。我必须关心这条消息吗?后缀是“在末尾添加的”。因此,当编译器抱怨整数常量末尾的后缀无效时,它会被单个标记打乱 因为它将内部的
摄氏度
识别为整数后缀。允许的后缀为(N1570§6.4.4.1/1):
这些是小L字母,每个字母也允许大写(但不是lL
或lL
的任何组合)
它们表示unsigned、long和longlong,并影响前面整数常数的类型
因此,要实现宏替换,您需要生成令牌摄氏度
,然后预处理器可以将其替换为*10
:
#include <stdio.h>
#define CELSIUS *10
int main()
{
int testVar=0;
if(!testVar) testVar = 10 CELSIUS;
printf("%d\n", testVar);
return 0;
}
#包括
#定义摄氏度*10
int main()
{
int testVar=0;
如果(!testVar)testVar=10摄氏度;
printf(“%d\n”,testVar);
返回0;
}
注意:这是一个更现代的主功能签名。更好的(IMO)是intmain(intargc,char**argv)代码>后缀是“添加在末尾”的东西。因此,当编译器抱怨整数常量末尾的后缀无效时,它会被单个标记打乱
因为它将内部的摄氏度
识别为整数后缀。允许的后缀为(N1570§6.4.4.1/1):
这些是小L字母,每个字母也允许大写(但不是lL
或lL
的任何组合)
它们表示unsigned、long和longlong,并影响前面整数常数的类型
因此,要实现宏替换,您需要生成令牌摄氏度
,然后预处理器可以将其替换为*10
:
#include <stdio.h>
#define CELSIUS *10
int main()
{
int testVar=0;
if(!testVar) testVar = 10 CELSIUS;
printf("%d\n", testVar);
return 0;
}
#包括
#定义摄氏度*10
int main()
{
int testVar=0;
如果(!testVar)testVar=10摄氏度;
printf(“%d\n”,testVar);
返回0;
}
注意:这是一个更现代的主功能签名。更好的(IMO)是intmain(intargc,char**argv)代码>要小心。如果您使用这样的宏,将来会有很多问题。更好地使用:
/*....*/
#define CELSIUS(x) ((x)*10)
/*....*/
if(!testVar) testVar = CELSIUS(10);
printf("%d\n", testVar);
/*....*/
如果不这样做,代码中将有许多不可忽视的行为,如
要小心。如果您使用这样的宏,将来会有很多问题。更好地使用:
/*....*/
#define CELSIUS(x) ((x)*10)
/*....*/
if(!testVar) testVar = CELSIUS(10);
printf("%d\n", testVar);
/*....*/
如果不这样做,代码中将有许多不可忽视的行为,如
您定义了CELSIUM
并使用了CELSIUM
,这是一个打字错误吗?“但程序似乎可以编译。”。CELSIUM是个错误。我编辑了它。@xy36它两种方式都不编译。@xy36好吧,如果没有十六进制文件,它很难成功编译,对吗?你定义CELSIUM
并使用CELSIUM
,这是打字错误吗?“但程序似乎可以编译。”。CELSIUM是个错误。我编辑了它。@xy36它两种方式都不编译。@xy36好吧,如果没有十六进制文件,它很难成功编译,对吗?int main()
不仅仅是“更现代”
void main()
一直都是错误的。int main()
不仅仅是“更现代”void main()一直都是错误的。