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

imk*_*dal 10 c++ if-statement c-preprocessor preprocessor-directive

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

Pau*_*per 36

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

编译器 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
Run Code Online (Sandbox Code Playgroud)

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

#ifndef EXAMPLE_H
#define EXAMPLE_H

class Example { ... };

#endif
Run Code Online (Sandbox Code Playgroud)

你可以比运行时更快.

void some_debug_function() {
#ifdef DEBUG
    printf("Debug!\n");
#endif
}
Run Code Online (Sandbox Code Playgroud)

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


ber*_*kus 9

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

#if DEBUG
int a;
#else
double b;
#endif
Run Code Online (Sandbox Code Playgroud)

gcc -c -DDEBUG = 1 file.c将看到"int a"

gcc -c file.c会看到"double b"


Chr*_*ris 5

预处理程序允许您实际剪切或粘贴到要编译的源文件中。如果它被切掉,它消失了,像注释一样,什么也不做,没有编译,在二进制文件中不产生任何代码。开发人员通常会使用此技术仅在调试版本中添加代码以用于调试目的或用于添加或排除特定操作系统的代码。