在书籍 《实用C编程》 的第七章“编程过程”中,有一个Makefile文件:
什么是“正确的标头”?为什么在选项参数-D和__USE_FIXED_PROTOTYPES__之间没有空格?
在GCC镜像中,有:
File: calc1/makefile.gcc
#-----------------------------------------------#
# Makefile for unix systems #
# using a GNU C compiler #
#-----------------------------------------------#
CC=gcc
CFLAGS=-g -D__USE_FIXED_PROTOTYPES__ -ansi
#
# Compiler flags:
# -g -- Enable debugging
# -Wall -- Turn on all warnings (not used since it gives away
# the bug in this program)
# -D__USE_FIXED_PROTOTYPES__
# -- Force the compiler to use the correct headers
# -ansi -- Don't use GNU extensions. Stick to ANSI C.
calc1: calc1.c
$(CC) $(CFLAGS) -o calc1 calc1.c
clean:
rm -f calc1
什么是“正确的标头”?为什么在选项参数-D和__USE_FIXED_PROTOTYPES__之间没有空格?
在GCC镜像中,有:
/* __USE_FIXED_PROTOTYPES__ used to be required to get prototypes for
malloc, free, etc. on some platforms. It is unclear if we still
need it, but it can't hurt. */
#define __USE_FIXED_PROTOTYPES__
这里有来自Re: 是否真的需要__USE_FIXED_PROTOTYPES__
?的解释。
但我没有理解重点。
这本PRACC书于1997年出版,有些过时但仍然非常有用。Makefile有点过时,我想知道是否还需要.gcc扩展名。
《实用C编程》勘误表中都没有提到这两个问题。
-D
和__USE_FIXED_PROTOTYPES__
之间的空格是可选的。请注意,-ansi
标志已经过时,您现在应该使用其中之一:-std=c90
(这就是-ansi
的意思,或多或少),或者-std=c99
或-std=c11
(最好是后者),或者使用 GNU 变体之一(例如-std=gnu11
- 这是 GCC 7 中的默认值(以及 6 和 5 IIRC,但不是早期版本的默认值)。 - Jonathan Leffler.gcc
后缀用于makefile
可能是为了允许为不同的编译器编写不同的 makefile。如果您计划使用 GCC,则实际上不需要该后缀。它唯一的危害是您必须键入make -f makefile.gcc
而不是只需键入make
,至少在您键入ln -s makefile.gcc makefile
(或mv makefile.gcc makefile
)之前是这样。__USE_FIXED_PROTOTYPES__
的东西似乎在 20 年前是必要的;虽然如此,但在本千年的大部分时间里都不再需要。从 makefile 中删除它;它是现在无关紧要的历史材料。 - Jonathan Leffler