gpt4 book ai didi

c - 从 main.c 中进行单个定义,以便在编译时可用于库

转载 作者:行者123 更新时间:2023-11-30 18:14:31 25 4
gpt4 key购买 nike

假设我有一个 ma​​in.c 文件

#include "library.h"
#define LIBRARY_VALUE 5

int main(void)
{
somefunction1();
return 0;
}

库.h

void somefunction1(void);

库.c

#include "library.h"
#ifndef LIBRARY_VALUE
#define LIBRARY_VALUE 1
#endif

static unsigned char oneString[LIBRARY_VALUE]; // Also I need to be able
// to use the value to initialize
// static arrays that will be
// modified by somefunction1();
void somefunction1(void)
{
printf("The Library Value is %d\n", LIBRARY_VALUE);
}

我在这里想做的是能够编译 main.c 并使用 LIBRARY_VALUE 的值,就像我在 include 之后定义的那样ma​​in.c
我应该如何使用GCC来实现这一目标?我确实需要ma​​in.c中定义该值。

如果我必须更改代码,请提供最低限度的工作示例代码。所以我清楚地知道该怎么做。谢谢。

最佳答案

在 C 中,不同的 .c 文件无法共享其中一个 .c 文件中定义的公共(public)宏。传统做法是把它放在 .h 文件中,但你说这对你不起作用。

您将需要一种“构造函数”函数来在运行时设置“静态”信息。该构造函数可以由 main.c 直接调用,也可以通过让 main.c 定义库选取的 extern 来间接调用。

我会给你一些代码,但我还没有尝试编译它......我将把它作为学生的练习。

main.c

#include "library.h"int const library_value = 5;

int main(void){ somefunction1(); return 0;}

库.h

extern int const library_value;void somefunction1(void);

库.c

#include <assert.h>#include "library.h"static unsigned char *oneString;// destroy any memory from lib_init().static void lib_clear(void){    if ( oneString )    {        free(oneString);        oneString = NULL;    }}// initialization - strop the static if the caller is to start it up.static void lib_init( void ){    if ( ! oneString )             // (defensive "if" to be sure)    {          assert( library_value > 0 );        oneString = (unsigned char*)malloc( library_value );        atexit( &lib_clear );    }    }void somefunction1(void){    if ( ! oneString )    // if the main() is not calling an the constructor then        lib_init();       //  // every method within the library must do so.    printf("The Library Value is %d\n", library_value);}

lib_init() 和 lib_clear() 方法可以通过 lib_init( int size ) 签名来外部化以获取大小。

关于c - 从 main.c 中进行单个定义,以便在编译时可用于库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7311062/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com