我有多个功能可以在项目的构建时启用或禁用.
当前实现使用诸如的声明#define FEATURE_FOO.每当我需要做一些与特定功能相关的事情时,我都会使用预处理器指令,例如#ifdef.
功能定义存储在全局头文件中.
这种方法有两个缺点:
#include在每个文件中的此全局标头,在任何其他标头之前.这不是很好:
// 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)
我能找到更好的选择吗?