gpt4 book ai didi

c - 为什么使用 D 选项编译头文件会比使用 C 包装器编译头文件产生更大的文件?

转载 作者:行者123 更新时间:2023-11-30 15:44:00 24 4
gpt4 key购买 nike

我有这个 C 文件,用作头文件的包装器:

#define SOME_CONTROL_FLAG
#include "thefile.h"

如果我用这个编译:

gcc -I. -c -o thefile.o thefile.c

我得到一个 9 kB 的目标文件。但是,如果我这样做:

gcc -I. -c -D SOME_CONTROL_FLAG -o thefile.o thefile.h

我得到了一个 3 MB 的目标文件!那大约大了 300 倍。这两个命令行不应该产生相同的结果吗?

最佳答案

一般来说,用不同的符号编译编译出不同的代码

考虑以下代码。如果定义了FOOBAR,则文件中还有更多代码需要编译(在预处理器对其进行预处理之后):

#ifdef FOOBAR

int foo(int bar) {
return bar + bar;
}

#endif

int bar(int baz) {
return 1+baz;
}

使用 FOOBAR 定义的编译会更改输出的大小。没有 FOOBAR 时,它是 1232,而有了 FOOBAR 时,它是 1328。这不是一个巨大的差异,但它是一个差异。

$ gcc -c code.c -o code.o
$ ls -l code.o
-rw-rw-r-- 1 user user 1232 Oct 29 13:19 code.o

$ gcc -DFOOBAR -c code.c -o code.o
$ ls -l code.o
-rw-rw-r-- 1 user 1328 Oct 29 13:19 code.o

如果有很多条件代码,这可能非常重要。例如,定义符号可能会导致包含大量特定于平台的代码,而不定义符号可能会将函数实现保留为 stub 。

编译不同类型的代码会产生不同的代码大小

注意:这部分基于Urhixidur's (the OP's) answer 。我觉得有必要对其进行更多的阐述。

另一个可能导致不同编译对象大小的方面是 GCC 实际编译的内容。在你的例子中

gcc -I. -c -D SOME_CONTROL_FLAG -o thefile.o thefile.h

正在编译头文件,GCC 根据文件扩展名检测到它正在使用 c-header 语言进行编译。然而,您正在编译头文件并生成 .o 文件这一事实表明您希望将其编译为 C 语言,在这种情况下,您应该使用 GCC 的 -x 选项。关于它,手册页说:

 -x language
Specify explicitly the language for the following input files (rather than letting the compiler choose a default based on the file name suffix). This option applies to all
following input files until the next -x option. Possible values for language are:

c c-header cpp-output
c++ c++-header c++-cpp-output
objective-c objective-c-header objective-c-cpp-output
objective-c++ objective-c++-header objective-c++-cpp-output
assembler assembler-with-cpp
ada
f77 f77-cpp-input f95 f95-cpp-input
go
java

-x none
Turn off any specification of a language, so that subsequent files are handled according to their file name suffixes (as they are if -x has not been used at all).

基于此以及我在第一部分中使用的代码,我们可以观察到当我们将代码编译为 cc- header :

$ gcc -c code.h -o code.o # as a header
$ ls -l code.o
-rw-rw-r-- 1 user user 1470864 Oct 29 14:04 code.o

$ gcc -c -x c code.h -o code.o # as c code
$ ls -l code.o
-rw-rw-r-- 1 user user 1232 Oct 29 14:04 code.o

请注意,编译(作为 header )似乎不受符号定义的影响:

$ gcc -c code.h -o code.o
$ ls -l code.o
-rw-rw-r-- 1 user user 1470864 Oct 29 14:06 code.o

$ gcc -DFOOBAR -c code.h -o code.o
$ ls -l code.o
-rw-rw-r-- 1 user user 1470864 Oct 29 14:06 code.o

关于c - 为什么使用 D 选项编译头文件会比使用 C 包装器编译头文件产生更大的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19664887/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com