隐藏静态库中的结构定义

Bob*_*ury 6 c static struct static-libraries

我需要为客户端提供一个C静态库,并且需要能够使结构定义不可用.最重要的是,我需要能够使用全局变量在库初始化之前执行代码.

这是我的代码:

private.h


#ifndef PRIVATE_H
#define PRIVATE_H

typedef struct TEST test;

#endif


private.c (this should end up in a static library)

#include "private.h"
#include <stdio.h>

struct TEST
{
 TEST()
 {
  printf("Execute before main and have to be unavailable to the user.\n");
 }

 int a; // Can be modified by the user
 int b; // Can be modified by the user
 int c; // Can be modified by the user

} TEST;


main.c

test t;

int main( void )
{
 t.a = 0;
 t.b = 0;
 t.c = 0;

 return 0;
}
Run Code Online (Sandbox Code Playgroud)

显然这段代码不起作用......但是显示我需要做什么......有谁知道如何使这项工作?我谷歌相当多但无法找到答案,任何帮助将不胜感激.

TIA!

Sco*_*les 7

如果你正在使用gcc,你可以使用constructor属性,

void runs_before_main(void) __attribute__((constructor))
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

来自gcc文档

构造函数属性导致在执行进入main()之前自动调用该函数.类似地,析构函数属性导致在main()完成或调用exit()之后自动调用该函数.具有这些属性的函数对于初始化将在程序执行期间隐式使用的数据非常有用.

您可以提供可选的整数优先级来控制构造函数和析构函数的运行顺序.具有较小优先级编号的构造函数在具有较大优先级编号的构造函数之前运行; 析构函数的相反关系成立.因此,如果您有一个分配资源的构造函数和一个释放相同资源的析构函数,那么这两个函数通常具有相同的优先级.构造函数和析构函数的优先级与为命名空间范围的C++对象指定的优先级相同

如果要隐藏用户的结构,请在标头中声明结构,但在c文件中定义它,传递指针.举个例子:

// foo.h
typedef struct private_foo foo;
foo * create_foo(void);
void free_foo(foo * f);

// foo.c
struct private_foo {
    int i;
}
foo * create_foo(void){
    foo * f = malloc(sizeof(*foo));
    if (f) f->i = 1;
    return f;
}
...
Run Code Online (Sandbox Code Playgroud)

foo->i然后不能在外面访问foo.c.