我了解到,if
或者#if
两者都可以用于条件检查。既然我们可以检查条件使用if
,我们为什么要使用预处理器#if
?
如果我使用#if
而不是对我的代码有什么影响if
?
哪个更好用,为什么?
我了解到,if
或者#if
两者都可以用于条件检查。既然我们可以检查条件使用if
,我们为什么要使用预处理器#if
?
如果我使用#if
而不是对我的代码有什么影响if
?
哪个更好用,为什么?
if
并且#if
是具有不同目的的不同事物。
如果您使用该if
语句,则在运行时评估条件,并且两个分支的代码都存在于已编译的程序中。条件可以基于运行时信息,例如变量的状态。if
用于程序中的标准流控制。
如果您使用预处理器的#if
,则在编译时评估条件(最初这是在编译时之前,但现在预处理器通常是编译器的一部分),并且错误分支的代码不包含在编译程序中. 条件只能基于编译时信息(如#define
常量等)。#if
用于为不同的编译时环境提供不同的代码(例如,在 Windows 和 *nix 上编译的不同代码,诸如此类)。
我们不能说哪个更好用,因为一个用于编译阶段(#if
),另一个用于运行阶段(if
)
#if 1
printf("this code will be built\n");
#else
printf("this code will not\n");
#endif
尝试构建上面的代码,gcc -E
你会看到你的编译器将生成另一个只包含的代码:
printf("this code will be build\n");
另一个 printf 将不会出现在新代码(预处理器代码)中,然后不会出现在程序二进制文件中。
结论:#if
在编译阶段处理,但在if
程序运行时处理正常
您可以#if 0
在代码的一部分中使用 以避免编译器对其进行编译。就像你评论了这部分
例子
int main(void) {
printf("this code will be build\n");
#if 0
printf("this code will not\n");
#endif
}
相当于
int main(void) {
printf("this code will be built\n");
/*
printf("this code will not\n");
*/
}
嘿,两者都不一样
#if
在编译时测试条件是否为真。if
在运行时评估。当条件的结果在编译时已知时,您应该使用#if,如果直到运行时才知道结果,则应该使用常规。
#if DEBUG
我知道在编译时我正在进行调试构建
if (date == DateTime.Today)
取决于今天是什么日子
的一些用途#if
是:
因为上述所有内容都在编译时检查,这意味着:
例子:
仅为调试模式添加额外检查:
#define DEBUGLEVEL 2
#if DEBUGLEVEL > 1
printf("The value of x is: %d", x);
#end if
#if DEBUGLEVEL > 2
printf("The address of x is: %x", &x);
ASSERT(x > 100);
#end if
确保标头只包含一次:
#ifndef PERSON_H
#define PERSON_H
class Person{
....
};
#end if
根据平台有不同的代码:
#ifdef WINDOWS
time = QueryPerformanceCounter(..);
#else
time = gettimeofday(..);
#endif