似乎很清楚它应该设置.
__attribute__功能吗?一个宏?句法?__attribute__((destructor))跑?__attribute__((constructor))
static void initialize_navigationBarImages() {
navigationBarImages = [[NSMutableDictionary alloc] init];
}
__attribute__((destructor))
static void destroy_navigationBarImages() {
[navigationBarImages release];
}
Run Code Online (Sandbox Code Playgroud) 我想要一个全局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,它将自动添加定义libnameuser到names数组中的所有名称libnames.
有没有办法做到这一点?
在C++中,我可以将其插入names[names_len++] = "..."到全局对象的构造函数中,并且必须调用它.但我可以用普通的C做到这一点吗?
因此,我正在编写一个必须使用-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条警告?
我习惯使用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 解决方案。
我有一个打印调试日志的功能,必须根据环境变量进行切换。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()因为这是一个共享库。