在编译时创建一个包含行号的标识符
Create an identifier at compile time that has the line number as part of it
我想要一个 C++ 预处理器宏,它创建一个新的标识符,其中包含行号。这是为了将标识符用作不与任何其他变量名称冲突的一次性变量。例如,如果我写
VARNAME("Var")
在文件的第 100 行,我希望预处理器生成变量名:
Var100
请问我该怎么做?我知道我必须使用字符串化和 __LINE__
预定义宏,但我不太清楚如何将它们组合在一起。
您可以使用以下内容:
#define CAT_(a, b) a ## b
#define CAT(a, b) CAT_(a, b)
#define VARNAME(Var) CAT(Var, __LINE__)
例子
#define CAT_(a, b) a ## b
#define CAT(a, b) CAT_(a, b)
#define VARNAME(Var) CAT(Var, __LINE__)
int main()
{
int VARNAME(i) = 0; // produces `int i7 = 0;` since this is on line 7
}
输出
注意int VARNAME(i)
生成的变量名是i7
,如错误输出所示:
echo clang=============;clang++ -std=c++14 -O2 -Wall -pedantic -pthread main.cpp && ./a.out
echo gcc =============;g++ -std=c++14 -O2 -Wall -pedantic -pthread main.cpp && ./a.out
clang=============
main.cpp:7:9: warning: unused variable 'i7' [-Wunused-variable]
int VARNAME(i) = 0;
^
main.cpp:3:22: note: expanded from macro 'VARNAME'
#define VARNAME(Var) CAT(Var, __LINE__)
^
main.cpp:2:19: note: expanded from macro 'CAT'
#define CAT(a, b) CAT_(a, b)
^
main.cpp:1:20: note: expanded from macro 'CAT_'
#define CAT_(a, b) a ## b
^
<scratch space>:3:1: note: expanded from here
i7
^
1 warning generated.
gcc =============
main.cpp: In function 'int main()':
main.cpp:7:17: warning: unused variable 'i7' [-Wunused-variable]
int VARNAME(i) = 0;
^
main.cpp:1:20: note: in definition of macro 'CAT_'
#define CAT_(a, b) a ## b
^
main.cpp:3:22: note: in expansion of macro 'CAT'
#define VARNAME(Var) CAT(Var, __LINE__)
^
main.cpp:7:9: note: in expansion of macro 'VARNAME'
int VARNAME(i) = 0;
^
我想要一个 C++ 预处理器宏,它创建一个新的标识符,其中包含行号。这是为了将标识符用作不与任何其他变量名称冲突的一次性变量。例如,如果我写
VARNAME("Var")
在文件的第 100 行,我希望预处理器生成变量名:
Var100
请问我该怎么做?我知道我必须使用字符串化和 __LINE__
预定义宏,但我不太清楚如何将它们组合在一起。
您可以使用以下内容:
#define CAT_(a, b) a ## b
#define CAT(a, b) CAT_(a, b)
#define VARNAME(Var) CAT(Var, __LINE__)
例子
#define CAT_(a, b) a ## b
#define CAT(a, b) CAT_(a, b)
#define VARNAME(Var) CAT(Var, __LINE__)
int main()
{
int VARNAME(i) = 0; // produces `int i7 = 0;` since this is on line 7
}
输出
注意int VARNAME(i)
生成的变量名是i7
,如错误输出所示:
echo clang=============;clang++ -std=c++14 -O2 -Wall -pedantic -pthread main.cpp && ./a.out
echo gcc =============;g++ -std=c++14 -O2 -Wall -pedantic -pthread main.cpp && ./a.out
clang=============
main.cpp:7:9: warning: unused variable 'i7' [-Wunused-variable]
int VARNAME(i) = 0;
^
main.cpp:3:22: note: expanded from macro 'VARNAME'
#define VARNAME(Var) CAT(Var, __LINE__)
^
main.cpp:2:19: note: expanded from macro 'CAT'
#define CAT(a, b) CAT_(a, b)
^
main.cpp:1:20: note: expanded from macro 'CAT_'
#define CAT_(a, b) a ## b
^
<scratch space>:3:1: note: expanded from here
i7
^
1 warning generated.
gcc =============
main.cpp: In function 'int main()':
main.cpp:7:17: warning: unused variable 'i7' [-Wunused-variable]
int VARNAME(i) = 0;
^
main.cpp:1:20: note: in definition of macro 'CAT_'
#define CAT_(a, b) a ## b
^
main.cpp:3:22: note: in expansion of macro 'CAT'
#define VARNAME(Var) CAT(Var, __LINE__)
^
main.cpp:7:9: note: in expansion of macro 'VARNAME'
int VARNAME(i) = 0;
^