找不到 main()。为什么这个程序打印“你好”?

Pal*_*den 0 c preprocessor c-preprocessor

#include<stdio.h>

#define begin(m,a,i,n) m##a##i##n
#define start begin(m,a,i,n)

void start() {
   printf("Hello");
}
Run Code Online (Sandbox Code Playgroud)

是的,是的,我确实看到了这些字母,m a i n但是它们是如何组合在一起并起作用的?

调试器...似乎对这个程序没有帮助。

Ste*_*ith 6

这是通过 c 预处理器宏完成的。

#define begin(m,a,i,n) m##a##i##n
#define start begin(m,a,i,n)
Run Code Online (Sandbox Code Playgroud)

它们在编译器解析文件之前对文件中的文本进行操作。

在预处理器阶段发生以下转换:

void start() {
Run Code Online (Sandbox Code Playgroud)

读取“开始”。“start”匹配名为 的宏start,因此它被替换为 start 的值。

void begin(m,a,i,n)() {
Run Code Online (Sandbox Code Playgroud)

现在“begin”匹配宏,begin因为它有 4 个参数。因此,它也被替换为 的值begin##是连接运算符。它接受参数的值并对它们进行字符串连接。在这种情况下,参数分别m, a, i, n具有值m, a, i ,n。所以m, a, i, n被连接到“main”作为开始的值。

void main() {
Run Code Online (Sandbox Code Playgroud)

这就是主要的方式。

请注意,因为这发生在预处理器阶段,所以它发生在您的代码被解析之前。您无法在调试器中完成转换,因为它在所有文本转换发生后才能与代码一起使用。

高级编译器阶段:预处理器 -> 解析 -> 分析 -> 优化 -> 代码生成