0

我正在制作一个小型图书馆,我想为用户提供禁用他们不需要的部分的选项。

库文件

#ifndef ONLY_BASICS
    void complexFunction(void);
#endif

库文件

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

主程序

#define ONLY_BASICS
#include "lib.h"

我在其他图书馆看到过这样做,我错过了什么?

4

2 回答 2

1

您可以让用户使用来自编译器的预置宏来控制构建,而无需编辑代码。如果您使用GCC-D ,请使用后跟宏名称的开关。在Microsoft 编译器上使用该/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
$ 
于 2013-08-28T19:30:15.807 回答
0

您似乎误解了库是什么以及它的用途。大多数(全部?)链接器已经通过不包含库中未引用的符号来完成您正在尝试的操作 - 这就是为什么使用 gcc,例如,您需要将库放在命令行末尾包含的源文件列表之后对库函数的引用。

您所做的似乎将此行为与库本身的编译时选项混淆了。在这种情况下,您可以像在and#ifndef中一样使用这些块,但您不需要在其中执行任何操作- 库已经在没有. 您可能希望让您的库构建过程生成一个标头来描述可用的功能。lib.hlib.cmain.ccomplexFunction

于 2013-08-28T18:29:35.207 回答