我试图理解#ifdef
宏。下面的示例代码。
getval(int val)
{
if(val==0) {
#ifndef PKT
#define PKT
#endif
}
}
main() {
getval(0);
#ifdef PKT
printf("Packet\n");
#endif
}
Packet
即使我传递1
给getval
. 为什么我在PKT
未定义时得到输出val=1
?谢谢。
我试图理解#ifdef
宏。下面的示例代码。
getval(int val)
{
if(val==0) {
#ifndef PKT
#define PKT
#endif
}
}
main() {
getval(0);
#ifdef PKT
printf("Packet\n");
#endif
}
Packet
即使我传递1
给getval
. 为什么我在PKT
未定义时得到输出val=1
?谢谢。
#define
并#ifdef
在编译时进行评估(实际上甚至在编译之前)。它们在文本文件上进行评估,独立于下面的 C 代码。因此在
if(val==0) {
#ifndef PKT
#define PKT
#endif
}
#define
总是完成的。否则说,您的代码等效于定义在函数之外的相同代码。见https://en.wikipedia.org/wiki/C_preprocessor
这些#
指令是编译时而不是运行时。所以你通过什么并不重要。如果定义了宏PKT
,则打印“数据包”,否则不打印。
如果您正在运行gcc
,您可以gcc -E myfile.c
在预处理后检查结果。
如果从getval
函数中删除一堆预处理器指令,则不会打印“数据包”,因为在这种情况下PKT
未定义,因此#ifdef PKT
为 false 并且printf
不会到达编译器。
#define PKT
在实际编译之前由预处理器评估您的那部分,而不是在程序执行期间。因此,它不受条件限制if(val==0)
。
可以改用此代码:
#define val 0
#if val==0
#ifndef PKT
#define PKT
#endif
#endif //val == 0
int main()
{
#ifdef PKT
printf("Packet\n");
#endif
}
但是,请注意,您必须在编译之前定义 val。
或者,您可以使用枚举:
typedef enum {PKT, NO_PKT} Packet;
Packet p;
getval(int val)
{
if (val == 0)
p = PKT;
else
p = NO_PKT;
}
int main()
{
getval(1);
if (p == PKT)
printf("Packet\n");
}