我了解到if
或#if
都可以用于条件检查。
我们可以使用if
检查条件,为什么我们要使用预处理器#if
?
如果我使用#if
代替if
,我的代码会有什么不同?
哪一个更好用,为什么?
答案 0 :(得分:37)
if
和#if
是不同用途的不同内容。
如果使用if
语句,则在运行时评估条件,并且两个分支的代码都存在于已编译的程序中。条件可以基于运行时信息,例如变量的状态。 if
用于程序中的标准流控制。
如果使用预处理器的#if
,则在编译时评估条件(原来这是在编译时之前,但是这些天预处理器通常是编译器的一部分) ,并且编译程序中包含假分支的代码不。条件只能基于编译时信息(例如#define
常量等)。 #if
用于为不同的编译时环境提供不同的代码(例如,用于在Windows上编译的不同代码与* nix,这类事情)。
答案 1 :(得分:13)
我们不能说哪个更好用,因为一个用于编译阶段(#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");
*/
}
答案 2 :(得分:6)
嘿嘿都是不同的
#if
在编译时测试条件是否为真。if
在运行时进行评估。答案 3 :(得分:4)
在编译时已知条件的结果时应使用#if,如果在运行时之前未知结果,则应使用常规。
#if DEBUG
我知道在编译时我正在进行调试构建
if (date == DateTime.Today)
取决于它是哪一天
答案 4 :(得分:2)
#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