我想在C语言中制作一个类,并在使用其功能之前通知开发人员“类”是否未初始化。在代码运行时很容易做到,但是在编译时会更好。
如果我在init()之前调用get_something(),我想在编译期间删除错误。可能吗?
//something.c
void init() {...}
int get_something() {...}
//main.c
int main()
{
#include something.h
get_something(); //pls drop compile error because wasn't initialized
return 0;
}
答案 0 :(得分:3)
在一般情况下,由于无法传达此类要求,因此在编译时是不可行的,即使存在,也可能无法在每种情况下使编译器证明所有导致{ {1}}首先打电话给get_something
。
在某些特殊情况下,您可能可以通过一些可疑的黑客程序来获得编译时警告,例如,将init
包含something.h
–然后,启用了足够警告的某些编译器将发出警告除非您调用了static void init(void) { real_init(); }
未使用的函数static
(从任何地方开始-可能仍有一些未调用它的代码路径)。
在运行时,您可以跟踪init
是否已被调用以及init
是否已在依赖它的所有内容中被调用。 (然后可以在生产代码中将assert
宏编译为空,请参见文档。)
答案 1 :(得分:1)
AFAIK无法做到这一点,如果您可以使用静态断言(C11)并检查__COUNTER__
预定义的宏是否检查init()
是否在某个位置被调用,这是一个非常丑陋的技巧。程序,例如:
#include <stdio.h>
#include <assert.h>
#define init() do {__COUNTER__; init();} while(0);
void (init)(void) // parenthesis prevents the expansion and allows you
// to call a macro with the same name
{
/* ... */
}
int get_something(void)
{
/* ... */
return 0;
}
int main(void)
{
static_assert(__COUNTER__ == 1, "init() is never used");
return 0;
}