分离公共代码并放置公共 headers
Separating common code and placing common headers
我发现两个相互矛盾的答案如何处理常见的包含 (one, two),所以我决定描述我的案例...
我有一个小项目,最初包含4个小应用程序。
假设我有文件 A.c、B.c、C.c 和 D.c。为了改善代码状态,我决定将公共源代码分开。我创建了 Common.h 和 Common.c。现在每个应用程序都依赖于 Common.o。请检查以下 makefile:
OBJ := $(OBJDIR)/A.o $(OBJDIR)/B.o $(OBJDIR)/C.o $(OBJDIR)/D.o
HEADERS := $(SRCDIR)/common.h
MODULES := $(BUILDDIR)/A $(BUILDDIR)/B $(BUILDDIR)/C $(BUILDDIR)/D
all: dir $(OBJ) $(MODULES)
dir :
mkdir -p $(BUILDDIR)
$(BUILDDIR)/A : $(OBJDIR)/A.o $(OBJDIR)/common.o
$(CC) $^ -o $@ $(CFLAGS)
$(BUILDDIR)/B : $(OBJDIR)/B.o $(OBJDIR)/common.o
$(CC) $^ -o $@ $(CFLAGS)
$(BUILDDIR)/C : $(OBJDIR)/C.o $(OBJDIR)/common.o
$(CC) $^ -o $@ $(CFLAGS)
$(BUILDDIR)/D : $(OBJDIR)/D.o $(OBJDIR)/common.o
$(CC) $^ -o $@ $(CFLAGS)
$(OBJDIR)/%.o : $(SRCDIR)/%.c $(HEADERS)
$(CC) -c $< -o $@ $(CFLAGS)
.PHONY: clean
clean:
rm -rf $(BUILDDIR)
我在每个文件 *.c 中包含:#include<stdio.h>, #include <stdlib.h>, #include <string.h>
我应该将这些包含分别保存在每个 .c 文件中吗?或者把它放在 common.h 中是好习惯吗?
在我看来,我可以将这些 headers 保留在 common.h 中,因为每个应用程序都依赖于 common.o。这是一个正确的方法吗?在 A.c、B.c、C.c、D.c 和 Common.c 中需要 stdlib.h、stdio.h 和 string.h( Common.h 的声明不需要这些文件中的任何一个),但是将它们放在 common.h 中并且不将它们包含在每个 .c 文件中是合乎逻辑的......这种方法正确吗?
总结:如果在每个.c文件中我都有malloc(在common.c中也是),我可以把#include <stdlib.h>
只放在[=34=中吗? ] 然后在所有 .c 文件中包含 common.h?
我正在关闭这个问题。感谢您在评论中的所有回答。
总结:
A rule of thumb (which is not necessarily the only one that has to
exist) is that you include the immediate dependencies where these are
needed without relying on indirect inclusion.
我发现两个相互矛盾的答案如何处理常见的包含 (one, two),所以我决定描述我的案例...
我有一个小项目,最初包含4个小应用程序。 假设我有文件 A.c、B.c、C.c 和 D.c。为了改善代码状态,我决定将公共源代码分开。我创建了 Common.h 和 Common.c。现在每个应用程序都依赖于 Common.o。请检查以下 makefile:
OBJ := $(OBJDIR)/A.o $(OBJDIR)/B.o $(OBJDIR)/C.o $(OBJDIR)/D.o
HEADERS := $(SRCDIR)/common.h
MODULES := $(BUILDDIR)/A $(BUILDDIR)/B $(BUILDDIR)/C $(BUILDDIR)/D
all: dir $(OBJ) $(MODULES)
dir :
mkdir -p $(BUILDDIR)
$(BUILDDIR)/A : $(OBJDIR)/A.o $(OBJDIR)/common.o
$(CC) $^ -o $@ $(CFLAGS)
$(BUILDDIR)/B : $(OBJDIR)/B.o $(OBJDIR)/common.o
$(CC) $^ -o $@ $(CFLAGS)
$(BUILDDIR)/C : $(OBJDIR)/C.o $(OBJDIR)/common.o
$(CC) $^ -o $@ $(CFLAGS)
$(BUILDDIR)/D : $(OBJDIR)/D.o $(OBJDIR)/common.o
$(CC) $^ -o $@ $(CFLAGS)
$(OBJDIR)/%.o : $(SRCDIR)/%.c $(HEADERS)
$(CC) -c $< -o $@ $(CFLAGS)
.PHONY: clean
clean:
rm -rf $(BUILDDIR)
我在每个文件 *.c 中包含:#include<stdio.h>, #include <stdlib.h>, #include <string.h>
我应该将这些包含分别保存在每个 .c 文件中吗?或者把它放在 common.h 中是好习惯吗?
在我看来,我可以将这些 headers 保留在 common.h 中,因为每个应用程序都依赖于 common.o。这是一个正确的方法吗?在 A.c、B.c、C.c、D.c 和 Common.c 中需要 stdlib.h、stdio.h 和 string.h( Common.h 的声明不需要这些文件中的任何一个),但是将它们放在 common.h 中并且不将它们包含在每个 .c 文件中是合乎逻辑的......这种方法正确吗?
总结:如果在每个.c文件中我都有malloc(在common.c中也是),我可以把#include <stdlib.h>
只放在[=34=中吗? ] 然后在所有 .c 文件中包含 common.h?
我正在关闭这个问题。感谢您在评论中的所有回答。 总结:
A rule of thumb (which is not necessarily the only one that has to exist) is that you include the immediate dependencies where these are needed without relying on indirect inclusion.