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

标签 c c-preprocessor

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

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

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

这种方法有两个缺点:

  1. 它要求在每个文件中#include 这个全局 header ,在任何其他 header 之前。
  2. 我无法轻易禁用 C 文件:

这不是很好:

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

#include "main_header.h"
#ifdef FEATURE_FOO
...
#endif

因为我更喜欢这个:

// file: foo.c
#ifdef FEATURE_FOO

#include <stdio.h>
...
#endif

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

gcc -DFEATURE_FOO -c %< -o %@

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

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

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

%o: %c
    gcc $(DEFINES) -c %< -o $@

我能找到什么更好的选择?

最佳答案

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

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

关于C 项目 - 如何管理功能列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31657152/

相关文章:

c++ - Win32 逻辑 block 预处理器显示不活动

c - ActionScript 2.0 中有类似 C 的 #define 的东西吗?

c - 形参1的类型不完整

c - 为什么 Stringification 不能按预期工作

c - 从 C 中的输入文件中识别字符

c - 带有 CSS 的 GtkProgressBar 进度颜色不起作用

c - 避免段错误

java - #if 在 Java 中,就像在 C 预处理器中一样

带有定义或内联的 C++ 宏?

c++ - 奇怪的预处理