之前學習過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裡面...