Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fill the lost example code in headers.rst (Section1.3) #6

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
🕵️ Fix typo and add code blocks
ChienKaiMa committed Jan 31, 2021
commit c46eed8a2a8190826128cbec577f2a824ea0ed68
24 changes: 23 additions & 1 deletion google-cpp-styleguide/headers.rst
Original file line number Diff line number Diff line change
@@ -54,6 +54,14 @@
定義:
前置宣告是不提供與之關連的定義下,宣告一個類別、函式或是樣板。

.. code-block:: c++

// In a C++ source file:
class B;
void FuncInB();
extern int variable_in_b;
ABSL_DECLARE_FLAG(flag_in_b);

優點:

* 由於 ``#include`` 會強制編譯器開啟更多的檔案與處理更多的輸入,利用前置宣告減少 ``#include`` 可以減少編譯時間。
@@ -64,7 +72,21 @@
* 前置宣告可能隱藏掉與標頭檔間的相依關係,導致當標頭檔改變時,相依的程式碼沒有被重新編譯。
* 前置宣告可能在函式庫進行可向下相容的 API 改動時發生編譯錯誤。例如函式庫開發者放寬了某個參數類型、替樣板增加預設參數或更改命名空間等等。
* 前置宣告來自 ``std::`` 命名空間的 symbols 會導致未定義行為 (undefined behavior)。
* 難以抉擇是要使用前置宣告或是引入完整得標頭檔。在某些狀況下,使用前置宣告替換掉 ``#include`` 可能意外的修改了程式碼的意圖。若 ``#include`` 被替換成 B 和 D 的前置宣告 ``test()`` 會呼叫到 ``f(void*)``。
* 難以抉擇是要使用前置宣告或是引入完整的標頭檔。在某些狀況下,使用前置宣告替換掉 ``#include`` 可能意外的修改了程式碼的意圖。

.. code-block:: c++

// b.h:
struct B {};
struct D : B {};

// good_user.cc:
#include "b.h"
void f(B*);
void f(void*);
void test(D* x) { f(x); } // calls f(B*)

若 ``#include`` 被替換成 B 和 D 的前置宣告 ``test()`` 會呼叫到 ``f(void*)``。
* 使用前置宣告多個 symbols 可能暴露了比直接引入標頭檔更多的訊息。
* 為了使用前置宣告而修改程式碼(例如:使用指標成員而不是物件成員) 可能會導致程式運作較為緩慢或是更加的複雜。