gpt4 book ai didi

c - C 宏中的函数定义

转载 作者:行者123 更新时间:2023-11-30 16:31:06 25 4
gpt4 key购买 nike

此代码抛出一个错误,指出“代码未定义”。

#include<stdio.h>
#define MAIN() c##o##d##e
int main()
{
MAIN();
printf("C program");
return 0;
}
int code()
{
printf("C is life");
}

然而,这段代码运行顺利。

#include<stdio.h>
#define MAIN() m##a##i##n
int main()
{
MAIN();
printf("C program");
return 0;
}
int code()
{
printf("C is life");
}

输出:

C program

这段代码运行也很顺利。

#include <stdio.h>
#define macro(n, a, i, m) m##a##i##n
#define MAIN macro(n, a, i, m)

int MAIN()
{
printf("C is life");
return 0;
}

输出:

C is life

在第一个代码中,为什么代码不像 main 那样工作?我不知道宏完成串联'main'之后的过程是什么。请用简单的术语解释这些代码背后的过程。提前致谢。

我也尝试过定义代码函数。

#include<stdio.h>
#define MAIN() c##o##d##e
int code(void);
int main()
{
MAIN();
printf("C program");
return 0;
}
int code(void)
{
printf("C is life\n");
return 0;
}

输出:

C program

所以,定义一个函数应该不是问题。我的问题是,串联后会发生什么?提前致谢。

最佳答案

在 C 中(自 C99 标准以来),您需要在使用所有函数之前声明它们。

在第一个示例中,您在尝试使用 code 函数之前尚未声明它。您可以通过添加函数原型(prototype)来解决它:

// Declare the function, also known as a function prototype
void code(void);

int main(void)
{
// ...
}

// Define the function
void code(void)
{
// ...
}

第二个示例之所以有效,是因为您使用了当时已经声明的 main 。如果之前没有声明过函数,则定义也会声明该函数。

另请注意,扩展后的宏实际上不会调用code(或main)函数。这很好,因为递归(直接或间接)调用 main 通常是不好的。

关于c - C 宏中的函数定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50796332/

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