作者:
arrenwu (鍵盤的戰鬼)
2021-02-20 17:14:58※ 引述《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
作者:
wahaha99 (此方不可長)
2021-02-20 17:17:00這是語言定義問題還是Compiler的問題!?
作者:
loadingN (sarsaparilla)
2021-02-20 17:18:00我不知道 反正compiler小精靈幫我做了
#ifndef 都變成常識了,C++20才想到要處理= =
所以是在說原本C的head file沒做這些處理ㄇ
作者:
nimura14 (陣內家的孩子)
2021-02-20 17:29:00我也以為 header guards preprocessor variable 就會擋耶,不是。header guard 有檔阿,三個檔案預處理完大小差不多阿。
作者:
wahaha99 (此方不可長)
2021-02-20 17:34:00我的意思是說 會造成 include 三次 是語言如此定義還是Compiler沒有去處理?
作者:
nimura14 (陣內家的孩子)
2021-02-20 17:35:00hello.cpp 和 world.cpp 各 include iostream 一次helloworld.cpp include iostream 三次,但他們大家相當所以代表 preprocessor 在預處理 helloworld.cpp 時,header guard 有起到作用吧?! *大小相當
作者:
tkucuh (tku's cuh)
2021-02-20 17:37:00重覆symbols會被同事打死
作者:
KILLE (啃)
2021-02-20 17:39:00樓上 有人用人家庫 不小心就撞到些常用名 像PACKET_SIZE
作者:
nimura14 (陣內家的孩子)
2021-02-20 17:40:00我看 C++ primer 上有建議,symbol 最好訂在 class 中,
作者:
tkucuh (tku's cuh)
2021-02-20 17:41:00第三方在GLOBAL或define很少用這麼短的吧...
作者:
nimura14 (陣內家的孩子)
2021-02-20 17:41:00讓 class scope 隔開,避免衝突。
作者:
KILLE (啃)
2021-02-20 17:41:00這邊講的第三方是指在網路上黏貼人家代碼
其實C/C++都有方法解決這問題 只是一直沒放到內建
作者:
tkucuh (tku's cuh)
2021-02-20 17:42:00那被打死不是應該嗎?XDDDD
作者:
nimura14 (陣內家的孩子)
2021-02-20 17:42:00我也不知道 iostream 多大 (汗..),但肯定不小吧!
作者:
hizuki (ayaka)
2021-02-20 17:43:00define a const value要換成vonst expr才是現代用法
作者:
nimura14 (陣內家的孩子)
2021-02-20 17:43:00istream 和 ostream 這兩個 class 不知道包了多少神奇多載運算子功能在裡面。