※ 引述《HankYang (黄金神掌)》之铭言:
: 如题
: 就是我啦!
: 最近无聊去看C++20的新特性
: 靠北呀
: #include感觉要被淘汰惹
: 要改成类似python或javascript的module
: 变成import跟export
: 然后新的range library
: 靠背怎么那么像js
: C++是不是要变成妖魔鬼怪了
: 有没有八卦
刚刚随便Google了一下,这边有篇文章讲到Module的优点
https://www.modernescpp.com/index.php/cpp20-modules
考虑下面这个写在 helloWorld.cpp 里面的简单程式
// helloWorld.cpp
#include <iostream>
int main() {
std::cout << "Hello World" << std::endl;
}
本来.cpp档案大小 100,compile完变成executable是 12928
https://www.modernescpp.com/images/blog/Cpp20/Cpp20Modules/helloWorld.png
但在变成executable前,中间有一个 preprocessing,
也就是把那些 #include and #define的东西全部换成对应的文字。
https://www.modernescpp.com/images/blog/Cpp20/Cpp20Modules/preprocessor.png
这中间有个转换出来的程序,档案大小是 659471
而你如果把上面那个 HelloWorld 拆成几个档案
// hello.cpp
#include "hello.h"
void hello() {
std::cout << "hello ";
}
// hello.h
#include <iostream>
void hello();
// world.cpp
#include "world.h"
void world() {
std::cout << "world";
}
// world.h
#include <iostream>
void world();
// helloWorld2.cpp
#include <iostream>
#include "hello.h"
#include "world.h"
int main() {
hello();
world();
std::cout << std::endl;
}
在你 compile helloWorld2.cpp 的过程中, <istream>会被include 3次
https://www.modernescpp.com/images/blog/Cpp20/Cpp20Modules/helloWorld2.png
https://i.imgur.com/TJe4T5N.png
但他说如果是Module(import)那就只会import 1次
(奇怪 我还以为 #ifndef #endif 就是为了要避免这种事情发生)
照这文章的说法是这样compilation time可以减少
另外一个好处是 Module 容易避免撞到同样的 symbols。
像这下面这种情况,你include 的顺序会影响 RED 的数值
// webcolors.h
#define RED 0xFF0000
// productinfo.h
#define RED 0