生成check.c预处理文件时为何仅包含main2.h而非main.h?
为什么生成check.c的预处理文件时只包含了main2.h,没包含main.h?
文件结构
directory: main.h main2.h main.c main2.c check.c
main.c
int add(int a, int b){ return a + b; }
main.h
#pragma once int add(int a, int b);
main2.c
#include "main.h" int addTwice(int a , int b){ return 2*add(a, b); }
main2.h
#pragma once int addTwice(int a, int b);
check.c
#include <stdio.h> #include "main2.h" int main(){ printf("%d\n", addTwice(1,2)); }
生成的check.preprocessor内容
... # 983 "/usr/include/stdio.h" 3 4 # 2 "check.c" 2 # 1 "main2.h" 1 # 4 "main2.h" int addTwice(int a, int b); # 3 "check.c" 2 int main(){ printf("%d\n", add(1,2)); }
原因分析
预处理阶段只会处理当前编译文件中直接或间接引入的头文件,核心逻辑是:
check.c里只直接包含了main2.h,但main2.h的内容里并没有#include "main.h"的语句——#include "main.h"只写在main2.c里,而main2.c并没有被check.c引入。main2.h只是声明了addTwice的函数原型,完全不依赖main.h的内容,所以预处理check.c时,根本不需要加载main.h。
直白点说:check.c的依赖链里没涉及main.h,自然不会被预处理包含进去。虽然addTwice的实现用到了add,但那是编译main2.c时要处理的逻辑,和check.c的预处理过程没关系。
内容的提问来源于stack exchange,提问作者0xChaitanya
相关产品推荐
相关产品推荐

