我看到这种情况一直在Linux内核中完成。使用预处理器命令与普通C ++ if else阻塞的目的是什么?有速度优势还是什么?
答案 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)
预处理器允许您实际剪切或粘贴到源文件中,编译代码。如果它被删除,它就消失了,就像一个注释,什么都不做,没有编译,在二进制文件中不产生代码。开发人员通常会使用此技术仅在调试版本中添加代码以进行调试,或者为特定操作系统添加或排除代码。