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

问题描述 投票:0回答:4

我看到这种情况一直在发生,例如在 Linux 内核中。使用预处理器命令与普通 C++ if else 块相比的目的是什么?有速度优势什么的吗?

c++ if-statement c-preprocessor preprocessor-directive
4个回答
38
投票

预处理器会在编译之前更改 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
 的任何调用。


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

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

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

gcc -c file.c 将看到“double b”


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


0
投票
我们用下面的例子来讨论一下

#include <iostream> using namespace std; int main() { #if 1 cerr<<"Preprocessor directives used"; #endif if(0){ int a=10; } return 0; } #if 0 int 10 = a; int a = "hello"; #endif

    如果您运行上面的代码,您不会收到错误,但是如果您将 #if 0(主函数代码之外)内容替换为正常的 if(0) ,我们会收到语法错误。
  • 从中我们可以了解到预处理器是在编译时执行的,如果第一行错误,块内将不会执行。
© www.soinside.com 2019 - 2024. All rights reserved.