gpt4 book ai didi

c++ - 标识符未在宏中定义

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:21:45 27 4
gpt4 key购买 nike

我正在尝试下面的程序

#include <iostream>
using namespace std;
#define MKSTR(x) #x
#define CONCATE( x , y ) (x)##(y)

int main()
{
int xy = 100;
cout << MKSTR(HELLO C++) << endl;
cout << CONCATE(HELLO,C++) << endl;
cout << CONCATE(x,y) << endl;
return 0;
}

并得到错误

error C2065: 'HELLO' : undeclared identifier

.我不明白为什么 VS 2012 编译器需要宏参数或将它们视为标识符。此外,MKSTR 宏工作正常,但 CONCATE 宏给我带来了麻烦。无法理解为什么编译器会这样做。

最佳答案

您需要先连接符号,然后将其扩展为字符串,如下所示(在 GCC 4.8.1 中编译):

#include <iostream>
using namespace std;
#define MKSTR(x) #x
#define CONCATE( x , y ) x ## y
#define CONCATESTR( x , y ) MKSTR(x ## y)

int main()
{
int xy = 100;
cout << MKSTR(HELLO C++) << endl;
cout << CONCATESTR(HELLO,C++) << endl;
cout << CONCATE(x,y) << endl;
return 0;
}

输出:

HELLO C++
HELLOC++
100

编辑:

所以对于为什么MKSTR(CONCAT(...))不起作用的问题,原因是因为宏的展开顺序。因为 CONCATMKSTR 的参数,而 MKSTR 使用运算符 #,所以参数不会展开,而是立即被字符串化.你可以这样做来让它工作:

#include <iostream>
using namespace std;
#define CONCATE( x , y ) x ## y
#define MKSTR(x) #x
#define MKSTR2(x) MKSTR(x)
#define CONCATESTR( x , y ) MKSTR(x ## y)

int main()
{
int xy = 100;
cout << MKSTR2(HELLO C++) << endl;
cout << MKSTR2(CONCATE(HELLO,C++)) << endl;
cout << CONCATE(x,y) << endl;
return 0;
}

它会输出你所期望的。

关于c++ - 标识符未在宏中定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25156563/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com