是否可以在编译时检测函数是否被调用

Yve*_*ves 2 c++ templates metaprogramming enable-if

我正在开发一个C++库,有两个函数:func1func2

func1如果开发人员在调用之前忘记调用,我想生成编译时错误func2

这样就可以了:

func1();
func2();  // OK
Run Code Online (Sandbox Code Playgroud)

但这会失败:

func2();  // ERROR, you forget to call func1()
Run Code Online (Sandbox Code Playgroud)

当然,很容易生成运行时错误,但我想生成编译时错误。

我已经尝试如下,但它不起作用,因为我无法修改constexpr变量:

static constexpr bool b {false};

void func1() {
    b = true; // ERROR!
}

typename<std::enable_if_t<b == true>* = nullptr>
void func2() {}
Run Code Online (Sandbox Code Playgroud)

我不太擅长元编程。我想知道在这种情况下是否可能生成编译时错误。

Jar*_*d42 6

使时间耦合变得明确:

  • makefunc1返回一个应该由以下对象使用的类型func2
struct func1_result {
// Possibly constructors private, and friendship to `func1`.
//...
};

func1_result func1();
void func2(const func1_result&);
Run Code Online (Sandbox Code Playgroud)

func2所以你不能在没有先创建的情况下调用func1_result(由 返回func1)。


Ser*_*sta 5

至少在极端情况下这是不可能的。查看以下代码(为scanf简洁起见,省略了标头和返回值测试):

int main() {
    int code;
    printf("Enter code value: ");
    scanf("%d", &code);
    if (code > 0) func1();
    func2();               // has func1 be called ?
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在这里,即使是最好的静态分析工具也无法说明func1之前是否被调用func2,因为它取决于一个只有在运行时才知道的值。好吧,这是一个相当愚蠢的示例,但现实世界的程序经常在运行时读取其配置数据,并且该配置甚至可以更改其初始化的一部分。