如何使用#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));
}
...
}
//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));
}
...
}