相关疑难解决方法(0)

__attribute __((构造函数))究竟是如何工作的?

似乎很清楚它应该设置.

  1. 什么时候它运行?
  2. 为什么有两个括号?
  3. __attribute__功能吗?一个宏?句法?
  4. 这在C中有用吗?C++?
  5. 它的工作功能是否需要是静态的?
  6. 什么时候__attribute__((destructor))跑?

目标C中的示例:

__attribute__((constructor))
static void initialize_navigationBarImages() {
  navigationBarImages = [[NSMutableDictionary alloc] init];
}

__attribute__((destructor))
static void destroy_navigationBarImages() {
  [navigationBarImages release];
}
Run Code Online (Sandbox Code Playgroud)

c c++ gcc objective-c

327
推荐指数
4
解决办法
12万
查看次数

模仿C中的静态对象的构造函数

我想要一个全局names变量,看起来像这样

char* names[NAMES_CAP];
int names_len = 0;
Run Code Online (Sandbox Code Playgroud)

我希望每个链接到此库的人都能够将项目添加到此列表中.

很容易做到这一点main.

int main(int argc,char**argv) {
    names[names_len++] = "new name";
    names[names_len++] = "new name 2";
}
Run Code Online (Sandbox Code Playgroud)

但是如果我想要堆叠两个库怎么办?(即,我的库,libnames保存全局变量.如果有人链接到libnameuser谁使用libnames,它将自动添加定义libnameusernames数组中的所有名称libnames.

有没有办法做到这一点?

在C++中,我可以将其插入names[names_len++] = "..."到全局对象的构造函数中,并且必须调用它.但我可以用普通的C做到这一点吗?

c c++ constructor

5
推荐指数
1
解决办法
434
查看次数

宏后如何要求使用分号

因此,我正在编写一个必须使用-pedantic -ansi -std=c++98 -Werror和建立的库-Weverything用于铛和-Wall -WextraGCC和我有这个宏TESTSUITE(X)其目的是在全球范围内使用这样的:

TESTSUITE(current testsuite);
Run Code Online (Sandbox Code Playgroud)

它的作用是使用字符串调用一个函数(在程序启动时通过初始化哑变量):

#define TESTSUITE(name) \
static int ANONYMOUS_VARIABLE(SOME_PREFIX) = setTestSuiteName(#name)
Run Code Online (Sandbox Code Playgroud)

问题在于,这会在clang下为生成警告-Wglobal-constructors

如果我这样包围它_Pragma

#define TESTSUITE(name)                                              \
_Pragma("clang diagnostic push");                                    \
_Pragma("clang diagnostic ignored \"-Wglobal-constructors\"");       \
static int ANONYMOUS_VARIABLE(SOME_PREFIX) = setTestSuiteName(#name) \
_Pragma("clang diagnostic pop")
Run Code Online (Sandbox Code Playgroud)

使用宏后的分号将不需要进行编译(以及丢失时) -pedantic出现错误)。

如果我在宏末尾添加

static int ANONYMOUS_VARIABLE(SOME_PREFIX) = 5
Run Code Online (Sandbox Code Playgroud)

需要使用分号,但我会收到一个警告,提示我一个无法使用的未使用变量(因为如果用 _Pragma语句将其我将回到不需要分号的平方1)。

那么,有谁知道我该如何要求分号并同时显示0条警告?

c++ compiler-warnings suppress-warnings c-preprocessor

4
推荐指数
4
解决办法
2542
查看次数

如何可移植地加载动态库并运行其初始化代码?

我习惯使用dl_open()库函数动态加载共享对象/DLL:

void *dlopen(const char *filename, int flags);
Run Code Online (Sandbox Code Playgroud)

...并且这还运行 ELF 格式中标有 ; 的所有函数.init。或者在C/C++代码中,用 标记__attribute__((constructor))

__attribute__((constructor)) 到底是如何工作的?

然而 - 我只能确定这可以使用 GCC 和 GNU/Linux(也许在任何glibc可用的地方)上工作。

我的问题是:我怎样才能以更便携的方式做同样的事情?我对向其他编译器和其他平台的可移植性感兴趣。

注意:我标记了这个 C++,因为这就是我正在使用的,但显然 C-ish 解决方案是可以接受的 - 因为我上面描述的是 C-ish 解决方案。

c++ dll portability shared-libraries

3
推荐指数
1
解决办法
2603
查看次数

在共享库/DLL 中仅存储或检查 getenv() 的值一次

我有一个打印调试日志的功能,必须根据环境变量进行切换。print_trace()存储它并重用该值的最佳方法应该是什么,而不是每次调用时检查环境变量?

void print_trace(const char* msg)
{
    const char* s = getenv("DEBUG_TRACE");

    if(!strcmp(s,"ON"))
      printf(msg);
}
Run Code Online (Sandbox Code Playgroud)

没有,main()因为这是一个共享库。

c dll strcmp getenv

1
推荐指数
1
解决办法
382
查看次数