gpt4 book ai didi

c - 使用#define 强制调用一个函数

转载 作者:太空宇宙 更新时间:2023-11-04 01:28:32 26 4
gpt4 key购买 nike

假设我有以下代码:

void test(void) 
{
#define INIT_DONE
//General initialization stuff
}

void test2(void)
{
#ifndef INIT_DONE
#error "Call function test() first!"
#endif
// Specific initialization stuff
}

然后在 main() 中我调用这些函数如下:

int main(void)
{
test();
test2();
}

即使我先调用 test()#define INIT_DONE 我仍然得到:

"Call function test() first!"

编译器错误。

那么,我怎样才能实现函数 test() 必须在任何其他函数之前首先被调用。我可以用一些全局 bool 变量或其他东西来做到这一点,但我希望有一种预处理器方法可以做到这一点。有吗?

最佳答案

预处理器在您的代码被编译器处理之前运行。它所做的一切都发生在您的代码运行之前。预处理器没有函数或变量的概念,它只是将输入复制到输出并在两者之间扩展宏(它实际上做了更多的事情,但这并不重要)。对于您的代码,预处理器基本上看到了这一点:

gibberish

#define INIT_DONE

// comment

more gibberish

#ifndef INIT_DONE
#error "Call function test() first!"
#endif
// another comment

even more gibberish

预处理器遍历它并首先看到 #define INIT_DONE,因此它定义了宏 INIT_DONE to 1INIT_DONE 的每次出现都将在编译器看到代码之前被替换为 1。然后它会看到 #ifndef INIT_DONE,但 INIT_DONE 已经定义,因此它会跳过以下位。

重点是预处理器在任何时候都不会关心正在执行的是什么。做你想做的事,使用这样的东西:

#include <assert.h>

/* only visible in the source code form where test() and test2() are defined */
static int init_done = 0;

void test(void)
{
init_done = 1;
/* ... */
}

void test2(void)
{
assert(init_done);
/* ... */
}

通常没有办法在预处理器中执行此操作,因为预处理器在您的程序运行之前运行。您也可以忽略这些检查,只强调需要在您的文档中完成初始化。另一种方法是根本不需要程序员进行初始化,这取决于具体情况:

static int init_done = 0;

/* same initialization function as before */
void test(void)
{
init_done = 1;
/* ... */
}

void test2(void)
{
if (!init_done)
test();

/* ... */
}

关于c - 使用#define 强制调用一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27202572/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com