文件全局定义

时间:2013-08-28 18:25:59

标签: c header c-preprocessor

我正在创建一个小型库,我想让用户选择禁用他们不需要的部件。

lib.h

#ifndef ONLY_BASICS
    void complexFunction(void);
#endif

lib.c

#ifndef ONLY_BASICS
    void complexFunction(void) {
        printf("damn, this is complex alright!\n");
    }
#endif

的main.c

#define ONLY_BASICS
#include "lib.h"

我已经看到这在其他图书馆中完成,我缺少什么?

2 个答案:

答案 0 :(得分:1)

您可以使用编译器中预先存储的宏来控制构建,而无需编辑代码。如果您使用GCC,请使用开关-D,后跟宏名称。在Microsoft compiler上使用/D选项。

例如使用GCC,我有:

#include <stdio.h>

int main(int argc, char **argv) {

#ifdef SAYHI
    #ifdef CAPITAL
    printf("HI\n");
    #else
    printf("hi\n");
    #endif
#elif SAYHELLO
    #ifdef CAPITAL
    printf("HELLO\n");
    #else
    printf("hello\n");
    #endif
#else
    #ifdef CAPITAL
    printf("SAY SOMETHING\n");
    #else
    printf("say something\n");
    #endif
#endif

    return 0;
}

用户可以通过-DMACRO启用和禁用他想要的内容而无需编辑代码,例如:

$ gcc main.c
$ a.exe
say something
$ 
$ gcc main.c -DCAPITAL
$ a.exe
SAY SOMETHING
$ 
$ gcc main.c -DSAYHI -DCAPITAL
$ a.exe
HI
$ 
$ gcc main.c -DSAYHELLO
$ a.exe
hello
$ 

答案 1 :(得分:0)

似乎你误解了图书馆是什么以及图书馆的用途。大多数(所有?)链接器已经做了你正在尝试的东西,不包括来自库的未引用的符号 - 这就是为什么用gcc,例如,你需要将库放在命令行的 end 之后包含对库函数的引用的源文件列表。

您正在做的事情似乎将此行为与库本身的编译时选项混淆。在这种情况下,您可以像#ifndeflib.h一样使用lib.c块,但您不需要在main.c中执行任何操作 - 库已经存在在没有complexFunction的情况下构建。您可能希望让库构建过程生成一个标题,描述哪些功能可用。