You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

生成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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 14:02:38