c 巨集的乙個小技巧

2021-06-01 19:11:03 字數 979 閱讀 4785

之前學習過gtest,裡面定義乙個testcase很簡單

test(unitname,casename)

我比較好奇的就是在你定義完這些test(***x,***x)之後,初始化一下gtest,然後呼叫ruan_all_test(),就能跑你所有的testcase了。

之前一直以為他在那個巨集裡面有個呼叫全劇靜態註冊函式,把你定義的case註冊進case列表,然後跑ruan_all_test就能遍歷執行

所有的testcase。

當我自己試圖寫乙個類似的巨集的時候,才發現我相當簡單了。

比如:#define creat_class(classname)\

class 

classname\

\classcache::register<

classname

>();

假設 classcache是乙個全域性的靜態儲存器,register()是他裡面的乙個靜態成員函式模版,接受任何型別,並例項化乙個物件儲存起來。當我使用這個巨集的時候,比如我

creat_class(myclass)

編譯實際上是通不過的,因為編譯器會認為你這是乙個宣告而不是呼叫,當然我是在main函式之外呼叫這個巨集的。編譯器把在main函式之外呼叫的函式都認為是宣告,而不是執行函式。

我一下據對谷歌如何搞定編譯器的很好奇,我去原始碼看了下,發現谷歌用了很巧妙的技巧:

具體說了是這樣:

#define creat_class(classname)\

class classname\

\classname::

register  = classcache::register();

實際上谷歌做的事情很多,我只是按我的目的簡化了下,gtest在類的內部使用了乙個靜態變數,然後在main函式之外用註冊函式對它複製,很巧妙的讓這個靜態函式在main函式之外執行了,這也就是gtest只用乙個巨集就能完成class宣告和註冊兩個功能的原因。雖然沒用什麼很高深的技術,確實很巧妙。

乙個小技巧

下午去牙科看牙,順便幫我媽把鞋上個鞋絆。修鞋的老太太慈眉善目,於是跟她攀談起來。我問她,您看這鞋怎麼樣啊?老太太瞅瞅鞋,笑笑不說話。我又說,這是在沂蒙大樓專櫃買的,打折處理的 款,也不知道質量怎麼樣。老太太嗯嗯幾聲,還是不言語。一邊修著鞋,老太太看我態度還算虛心,就跟我傳授了經驗。大意就是,專櫃處理...

VIM ctags的乙個小技巧

vim可以使用ctags製作的tags檔案來瀏覽程式原始檔。問題是,當原始檔存放在目錄樹 也就是所謂的source tree 的時候,該怎麼辦呢?在預設情況下,ctags只會處理當前目錄裡的原始檔,而且vim也只會參考當前目錄的tags檔案。這時候,如果當前目錄裡的原始檔引用了其他目錄裡的定義,那麼...

tomcat的乙個小技巧

tomcat進入manage管理介面的方法.1,進入到tomcat檔案加然後進去找到conf資料夾裡面的tomcat user.xml檔案 2.用記事本開啟。3.要想進入到manage的管理頁面,首先新增乙個管理員角色 然後寫上你想要輸入的使用者名稱或者密碼即可 這樣就可以用從管理的manage裡面...