PTT推薦

Re: [問卦] C++20 也太機車了吧?

看板Gossiping標題Re: [問卦] C++20 也太機車了吧?作者
arrenwu
(不是綿芽的錯)
時間推噓11 推:11 噓:0 →:21

※ 引述《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


--
Hololive情人節特別錄音組合! (販售至台灣時間 2021-04-12 22:59)
集中包含角巻わため宝鐘マリン等27位Hololive VTuber的特別錄音
https://pbs.twimg.com/media/EuBfveQVEAEbmnY.jpg (圖片詐欺 沒露西亞語音包)

購買連結:https://booth.pm/en/items/2722499

--

※ PTT 留言評論
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 98.234.190.206 (美國)
※ 文章網址: https://www.ptt.cc/Gossiping/M.1613812509.A.7AE

cuteSquirrel02/20 17:16教授: C/C++助教就是你了。

wahaha9902/20 17:17這是語言定義問題還是Compiler的問題!?

都沒有問題啊 有誰有問題嗎?

loadingN02/20 17:18我不知道 反正compiler小精靈幫我做了

wonder00702/20 17:18#ifndef 都變成常識了,C++20才想到要處理= =

r5e97nk6302/20 17:28所以是在說原本C的head file沒做這些處理ㄇ

wonder00702/20 17:29沒啊 誰規定要做這些處理,不處理有不處理的玩法啊

nimura1402/20 17:29我也以為 header guards preprocessor variable 就會擋

nimura1402/20 17:31耶,不是。header guard 有檔阿,三個檔案預處理完大小

nimura1402/20 17:32差不多阿。

三個檔案預處理完差不多就是因為 include <iostream> 三次吧?

wahaha9902/20 17:34我的意思是說 會造成 include 三次 是語言如此定義

wahaha9902/20 17:35還是Compiler沒有去處理?

看起來是...compiler 就被教導要這樣幹?

nimura1402/20 17:35hello.cpp 和 world.cpp 各 include iostream 一次

nimura1402/20 17:36helloworld.cpp include iostream 三次,但他們大家相當

nimura1402/20 17:36所以代表 preprocessor 在預處理 helloworld.cpp 時,

nimura1402/20 17:37header guard 有起到作用吧?! *大小相當

從那文章看起來,preprocessing 做的是 text substitution 那本來大小 100 的東西會變成 659471,多出來的文字應該是來自 <iostream>

tkucuh02/20 17:37重覆symbols會被同事打死

KILLE02/20 17:39樓上 有人用人家庫 不小心就撞到些常用名 像PACKET_SIZE

nimura1402/20 17:40我看 C++ primer 上有建議,symbol 最好訂在 class 中,

tkucuh02/20 17:41第三方在GLOBAL或define很少用這麼短的吧...

nimura1402/20 17:41讓 class scope 隔開,避免衝突。

Java 直接強迫你只能這麼做 XD

tkucuh02/20 17:41C++離我有點遠...(遠目)

KILLE02/20 17:41這邊講的第三方是指在網路上黏貼人家代碼

AncientLich02/20 17:42其實C/C++都有方法解決這問題 只是一直沒放到內建

tkucuh02/20 17:42那被打死不是應該嗎?XDDDD

現在 continuous integration下,通常會有很多unit tests 你隨便亂define symbol會造成影響的話,merge前應該就會被發現了

nimura1402/20 17:42我也不知道 iostream 多大 (汗..),但肯定不小吧!

hizuki02/20 17:43define a const value要換成vonst expr才是現代用法

nimura1402/20 17:43istream 和 ostream 這兩個 class 不知道包了多少神奇多

※ 編輯: arrenwu (98.234.190.206 美國), 02/20/2021 17:45:08

nimura1402/20 17:44載運算子功能在裡面。

MrCool556602/20 19:10https://imgur.com/T4uqldS

lturtsamuel02/20 19:15module的好處有需要說明嗎 什麼樣的人會覺得基於文本

lturtsamuel02/20 19:15的onclude沒問題

hadumdum02/20 19:42看不懂耶:)