如果未调用init函数,则C丢弃编译器错误

时间:2019-06-25 13:31:15

标签: c

我想在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;
}

2 个答案:

答案 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;
}