Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何预定义宏';文件、线、函数、字符串化(#)工作?_C++_Macros - Fatal编程技术网

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预处理器会对所有宏进行扩展。