C项目 - 如何管理功能列表?

now*_*wox 3 c c-preprocessor

我有多个功能可以在项目的构建时启用或禁用.

当前实现使用诸如的声明#define FEATURE_FOO.每当我需要做一些与特定功能相关的事情时,我都会使用预处理器指令,例如#ifdef.

功能定义存储在全局头文件中.

这种方法有两个缺点:

  1. 它需要#include在每个文件中的此全局标头,在任何其他标头之前.
  2. 我无法轻松禁用C文件:

这不是很好:

// file: foo.c
#include <stdio.h>

#include "main_header.h"
#ifdef FEATURE_FOO
...
#endif
Run Code Online (Sandbox Code Playgroud)

因为我更喜欢这个:

// file: foo.c
#ifdef FEATURE_FOO

#include <stdio.h>
...
#endif
Run Code Online (Sandbox Code Playgroud)

因此,解决此问题的另一种方法是在构建时声明我的所有功能:

gcc -DFEATURE_FOO -c %< -o %@
Run Code Online (Sandbox Code Playgroud)

我不喜欢这里是我手动需要将每个功能传递给我的编译器.

可接受的解决方法是读取features.list包含所有功能的文件.在我的Makefile中,我将:

DEFINES=$(shell perl -ne 'print "-DFEATURE_$1 " if /(\w+)/' features.list)

%o: %c
    gcc $(DEFINES) -c %< -o $@
Run Code Online (Sandbox Code Playgroud)

我能找到更好的选择吗?

alk*_*alk 5

你可以使用gcc的选项-include myheader.h.

它将内容添加myheader.h到当前翻译单元源的最开头.