编译器在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()一直都是错误的。