编译相关
https://www.learncpp.com/cpp-tutorial/introduction-to-the-preprocessor/ 源地址
1.条件编译
该条件编译预处理指令允许你在什么条件下的东西会或不会进行编译指定。
有很多不同的条件编译指令,但我们只会覆盖最常用的三个:#ifdef,#ifnf和#endif。所述的#ifdef预处理指令允许预处理器以检查的标识符是否已经被先前的#define d。
如果是,则编译#ifdef和匹配#endif之间的代码。如果不是,则忽略代码。考虑以下程序:
#include <iostream>
#define PRINT_JOE
int main(){
#ifdef PRINT_JOE // if PRINT_JOE is defined
std::cout << "Joe\n"; // execute this code
#endif
#ifdef PRINT_BOB // if PRINT_BOB is defined
std::cout << "Bob\n"; // execute this code#endif
return 0;}
在这里插入代码片
因为PRINT_JOE已经#defined,所以cout << "Joe\n"将编译该行。由于PRINT_BOB尚未#defined,因此该行将cout << "Bob\n"被忽略。的#ifndef是相反的#ifdef,因为它可以让你检查的标识符是否已经不被#定义 ð呢。
#include <iostream>
int main(){
#ifndef PRINT_BOB
std::cout << "Bob\n";
#endif
return 0;}
2.#if 0
条件编译的另一个常见用途是使用#if 0来排除编译代码块(就像它在注释块中一样):
#include <iostream>
int main(){
std::cout << "Joe\n";
#if 0 // Don't compile anything starting here
std::cout << "Bob\n";
std::cout << "Steve\n";
#endif // until this point
return 0;}
上面的代码只打印“Joe”,因为“Bob”和“Steve”位于#if 0块中,预处理器将从编译中排除。这提供了一种方便的方法来“注释掉”包含多行注释的代码。
3.编译是从上到下编译
int foo(){
#define myname "alex";
}
int main(){
cout<<"my name is"<<myname;
return 0;
}
输出my name is alex
4.一个.cpp中的宏指令,只对这一个.cpp有用。对于剩下的.cpp没有意义。
预处理器完成后,将丢弃该文件中的所有已定义标识符。这意味着指令仅在定义点到定义它们的文件末尾有效。
在一个代码文件中定义的指令不会影响同一项目中的其他代码文件。
如下列代码:
function.cpp:
#include <iostream>
void doSomething(){
#ifdef PRINT
std::cout << "Printing!";#endif#ifndef PRINT
std::cout << "Not printing!";
#endif}
main.cpp
void doSomething(); // forward declaration for function doSomething()
#define PRINT
int main(){
doSomething();
return 0;}
结果是:not printing!
上一篇: 阿里云增设开源软件镜像站点