如何使用#ifndef 只执行一次函数内的一部分代码?

How to execute a part of code inside a function only once using #ifndef?

//static int initialized;
void print(struct student *arg) {
  #ifndef first_call
  #define first_call 1
  //if (!initialized) {
    //initialized = 1;
    printf("sizeof(*arg1): %lu\n", sizeof(*arg));
  //}
  #endif
  ...
}

我只想在 if 块中执行一次代码行。

当然我知道如何通过不同的方式做到这一点(评论部分)。

但我想知道为什么我的代码无法按预期工作。

谢谢。

你走错路了。 #ifdef 是预处理器命令,在 编译器之前 被解析。这意味着如果不满足条件,放在 #ifdef 块中的所有内容都会在编译前简单地删除。

对于您的特定问题,一种常见的方法是使用静态变量:

int my_func()
{
    static int initialized = 0;

    if (!initialized)
    {
        /* Initialize */
        ...

        initialized = 1;
    }

    ...
}

预处理器指令将在编译期间发生。意思是,在您的程序 运行 之前需要:

//static int initialized;
void print(struct student *arg) {
  #ifndef first_call
  #define first_call 1
  //if (!initialized) {
    //initialized = 1;
    printf("sizeof(*arg1): %lu\n", sizeof(*arg));
  //}
  #endif
  ...
}

并把它变成:

//static int initialized;
void print(struct student *arg) {
  #define first_call 1
  //if (!initialized) {
    //initialized = 1;
    printf("sizeof(*arg1): %lu\n", sizeof(*arg));
  //}
  ...
}

这意味着,你的意图不会发生。您只是将 first_call 定义为 1。

initialized这样的临时变量将是一个很好的解决方案,使它成为运行一次。不过请记住,退出此函数调用后,局部变量将被销毁。提示:查找 static variables..

这可行:

void print(struct student *arg) 
{
    static bool initialized = false;
    if (!initialized) 
    {
        initialized = true;
        printf("sizeof(*arg1): %lu\n", sizeof(*arg));
    }

    ...
}