为什么使用预处理器#if语句而不是if()else?

时间:2014-04-06 18:13:48

标签: c++ if-statement c-preprocessor preprocessor-directive

我看到这种情况一直在Linux内核中完成。使用预处理器命令与普通C ++ if else阻塞的目的是什么?有速度优势还是什么?

3 个答案:

答案 0 :(得分:35)

预处理器在编译之前更改C / C ++代码(因此 pre 处理器)。

预处理器ifs在编译时进行评估。

C / C ++ ifs在运行时评估。


你可以做一些在运行时无法完成的事情。

调整不同平台或不同编译器的代码:

#ifdef __unix__ /* __unix__ is usually defined by compilers targeting Unix systems */
#include <unistd.h>
#elif defined _WIN32 /* _Win32 is usually defined by compilers targeting 32 or 64 bit Windows systems */
#include <windows.h>
#endif

确保头文件定义仅包含一次(相当于#pragma once,但更便携):

#ifndef EXAMPLE_H
#define EXAMPLE_H

class Example { ... };

#endif

你可以比运行时更快。

void some_debug_function() {
#ifdef DEBUG
    printf("Debug!\n");
#endif
}

现在,当编译DEBUG未定义(可能是编译器的命令行参数)时,编译器可以优化对some_debug_function的任何调用。

答案 1 :(得分:9)

预编译器在编译过程之前运行,因此编译器甚至不会看到未采用的#if分支中的任何内容。

#if DEBUG
int a;
#else
double b;
#endif

gcc -c -DDEBUG = 1 file.c将看到&#34; int a&#34;

gcc -c file.c将看到&#34;双b&#34;

答案 2 :(得分:5)

预处理器允许您实际剪切或粘贴到源文件中,编译代码。如果它被删除,它就消失了,就像一个注释,什么都不做,没有编译,在二进制文件中不产生代码。开发人员通常会使用此技术仅在调试版本中添加代码以进行调试,或者为特定操作系统添加或排除代码。