C &引用;如果;及#“如果”;;哪一个更好用
我了解到,C &引用;如果;及#“如果”;;哪一个更好用,c,if-statement,C,If Statement,我了解到,if或#if都可以用于条件检查。 既然我们可以使用if检查条件,为什么要使用预处理器#if 如果我使用#if而不是if,会对我的代码产生什么影响 哪一个更好使用以及为什么?我们不能说哪一个更好使用,因为一个用于编译阶段(#if),另一个用于运行阶段(if) 尝试使用gcc-E构建上述代码,您将看到编译器将生成另一个仅包含以下内容的代码: printf("this code will be build\n"); 另一个printf将不会出现在新代码(预处理器代码)中,也不会出现在程序二
if
或#if
都可以用于条件检查。
既然我们可以使用if
检查条件,为什么要使用预处理器#if
如果我使用#if
而不是if
,会对我的代码产生什么影响
哪一个更好使用以及为什么?我们不能说哪一个更好使用,因为一个用于编译阶段(
#if
),另一个用于运行阶段(if
)
尝试使用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
,则在编译时对条件进行评估(最初是在编译时之前,但现在预处理器通常是编译器的一部分),编译程序中不包含假分支的代码。该条件只能基于编译时信息(例如#define
常量等)#if
用于在不同的编译时环境中使用不同的代码(例如,在Windows上编译的代码与在*nix上编译的代码不同,诸如此类)。当编译时已知条件的结果时,应使用#if;当直到运行时才知道结果时,应使用正则if
#if DEBUG
我知道在编译时我正在进行调试构建
if (date == DateTime.Today)
取决于今天是哪一天,他们两个都不一样
#if
在编译时测试条件是否为真如果
是在运行时计算的#if
的一些用法是:
- 您希望在生成代码的调试版本时进行额外打印或检查
- 您希望确保编译器不会两次包含.h文件
- 您希望编写使用不同系统调用的代码,并根据编译代码时使用的系统使用适当的系统调用
- 条件必须能够在编译时进行计算
- 生成的代码不会包含求值为false的分支,从而导致代码更小、速度更快,因为程序每次运行时都不会检查条件
#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
查找“预处理器”。我不理解-1。虽然这完全是一个愚蠢的问题,但这是一个非常有道理的问题。如果你不知道“preprocessor”关键字,就不太容易用谷歌搜索。我不理解“close as not constructive”投票:这是一个有点简单但完全合法的问题。@Krishnabharda既然你发现了一个重复的,你应该将这篇文章标记为重复的,并可能添加一条评论,这样人们就不会浪费时间回答这个问题了。我觉得这比所有“omg*scanf在没有阅读规范的情况下给出随机参数时不起作用”的问题更有建设性,因为用户每周都会提出这些问题,有时会对其进行投票。在我看来,它更像是一个复制品,但问题本身似乎是合理的。“一个用于编译阶段(#if),另一个用于编译阶段(if)”;)@米查尔布。是打字错误:)
#ifdef WINDOWS
time = QueryPerformanceCounter(..);
#else
time = gettimeofday(..);
#endif