我完全按照官方文档中的说法这里,并且我在Google上找不到任何关于预编译头不起作用的结果。 我正在使用
gcc main.c -lSDL2 -lSDL2_image
进行编译,并且我已经使用 gcc <headername>
编译了标头。我使用 -H 来检查 PCH 是否正在使用,是否未使用,我还使用了大约 45 个标头,并且不使用标头时编译时间有明显差异。
示例:
// main.c
#include <stdio.h>
#include "header.h"
int main() {
printf("%s\n", string);
return 0;
}
// header.h
char* string = "Hello World!";
编译为
gcc -H main.c
使用 gcc header.h
编译标头后,它会给出相同的输出
输出:
. /usr/include/stdio.h
.. /usr/include/bits/libc-header-start.h
... /usr/include/features.h
.... /usr/include/features-time64.h
..... /usr/include/bits/wordsize.h
..... /usr/include/bits/timesize.h
...... /usr/include/bits/wordsize.h
.... /usr/include/sys/cdefs.h
..... /usr/include/bits/wordsize.h
..... /usr/include/bits/long-double.h
.... /usr/include/gnu/stubs.h
..... /usr/include/gnu/stubs-64.h
.. /usr/lib/gcc/x86_64-pc-linux-gnu/13.2.1/include/stddef.h
.. /usr/lib/gcc/x86_64-pc-linux-gnu/13.2.1/include/stdarg.h
.. /usr/include/bits/types.h
... /usr/include/bits/wordsize.h
... /usr/include/bits/timesize.h
.... /usr/include/bits/wordsize.h
... /usr/include/bits/typesizes.h
... /usr/include/bits/time64.h
.. /usr/include/bits/types/__fpos_t.h
... /usr/include/bits/types/__mbstate_t.h
.. /usr/include/bits/types/__fpos64_t.h
.. /usr/include/bits/types/__FILE.h
.. /usr/include/bits/types/FILE.h
.. /usr/include/bits/types/struct_FILE.h
.. /usr/include/bits/types/cookie_io_functions_t.h
.. /usr/include/bits/stdio_lim.h
.. /usr/include/bits/floatn.h
... /usr/include/bits/floatn-common.h
.... /usr/include/bits/long-double.h
. header.h
Multiple include guards may be useful for:
/usr/include/bits/libc-header-start.h
/usr/include/bits/time64.h
/usr/include/bits/typesizes.h
/usr/include/features-time64.h
/usr/include/gnu/stubs-64.h
/usr/include/gnu/stubs.h
/usr/lib/gcc/x86_64-pc-linux-gnu/13.2.1/include/stddef.h
header.h
正如文档所说
一旦看到第一个 C 令牌,就无法使用预编译头。”
但是,通过在
<stdio.h>
之前包含 "header.h"
,<stdio.h>
包含大量 C 标记,因此不会使用预编译头。
尝试在
"header.h"
之前包含 <stdio.h
。或者更好的是,让 "header.h"
包含 <stdio.h>
,这样您就可以获得预编译的优势 stdio.h
。
另请注意,您的“header.h”包含定义,而不仅仅是声明,这可能会导致您在更大的项目中出现问题。