C++ 如何预定义宏';文件、线、函数、字符串化(#)工作?
如果我的编译器支持这些预定义宏(C++ 如何预定义宏';文件、线、函数、字符串化(#)工作?,c++,macros,C++,Macros,如果我的编译器支持这些预定义宏(\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu 我还了解到变量名、行号等与执行的程序集结束代码(由.cpp代码生成的实际.exe文件)无关,如果是这种情况,那么这些宏在代码中使用时如何工作?在汇编代码中如何表示\uuuuuu行\uuuuuu宏?当.exe文件遇到\uuuuu line\uuuu宏时,
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
我还了解到变量名、行号等与执行的程序集结束代码(由.cpp代码生成的实际.exe文件)无关,如果是这种情况,那么这些宏在代码中使用时如何工作?在汇编代码中如何表示\uuuuuu行\uuuuuu
宏?当.exe文件遇到\uuuuu line\uuuu
宏时,它如何知道原始.cpp源的正确行号
如何在汇编代码中表示行宏
不是。这些是预处理器宏。一旦预处理器运行,它们将被文字替换
例如,如果您有以下代码:
void foo() {
printf("%d", __LINE__);
}
预处理器会将其转换为:
void foo() {
printf("%d", 2);
}
1) “宏”如\uuuuu FILE\uuuu
和\uuuu LINE\uuuu
由编译系统的。源文本在编译器本身实际看到它之前被修改
2) 对于内置宏,如“\uuuuu行”
”,也是如此。这同样适用于您创建的任何宏,包括语句
3) 像“行号”和“函数名”这样的东西对调试器很重要。调试信息由编译器本身(而不是预处理器)生成。它与宏扩展或汇编代码生成相关,但与之不同
调试信息通常作为“元数据”直接保存在可执行文件中(以及汇编程序指令、字符串文本等)
您可以在此处阅读更多内容:
增编:
与调试器元数据(如上所述),func类似,但不同
根据C99标准:
6.4.2.2预定义标识符
语义:
标识符_ufunc uuu应由转换器隐式声明,就像在每个函数定义的左括号之后,声明一样
static const char\uuuu func\uuuu[]=“函数名”代码>
出现,其中function name是词汇封闭函数的名称
对该名称进行编码,就好像隐式声明已写入源字符集中,然后被转换为执行字符集,如转换阶段5所示
范例
考虑代码片段
#包括
void myfunc(void){
printf(“%s\n”,函数);
/* ... */
}
每次调用函数时,它都会打印到标准输出流:
myfunc
您还会在许多C编译器中看到\uuuu函数
,但它从来都不是标准的
您可以在此处阅读更多内容:
所以预处理器会检查这些宏的每次使用情况,并用数字替换它们?@JameyD预处理器会对所有宏进行扩展。