在輪子哥的 UnitTest.h 當中這段代碼是什麼意思?

在這個文件里,Vlpp/UnitTest.h at master · vczh-libraries/Vlpp · GitHub

在 79 行中 L_(#NAME) 這裡的下劃線起到什麼作用?按我的理解,L表示Name為寬字元,是直接放在Name的前面,下劃線是否多餘呢?

在 86 行,這裡的 TESTCASE_RUNNER_##NAME##_INSTANCE 的作用是什麼?這裡是 class 定義的結尾,應該是直接放個分號吧?


L_(#NAME)說的是要把NAME這個宏的參數的內容打出來,直接寫的話宏的展開順序會有問題。本來展開成L"Fuck"的代碼會變成LFuck,然後就跪了。

86行是定義了一個變數,這樣這個變數會在main函數執行之前執行,在這裡唯一的用途就是調用構造函數(84行)。

你看我在71行前置聲明了一個函數,然後放了個類,還放了個變數來註冊這個函數。88行定義了函數頭,然後後面緊接著的大括弧(你可以隨便找個譬如說TestBasic.cpp來看)就是這個函數體了。於是TEST_CASE宏的目的,就是為了把你接下來的代碼本身放進一個鏈表裡。於是main函數調用的RunAndDisposeTests函數就把你所有的TEST_CASE執行一遍。

展開前:

TEST_CASE(Fuck)
{
DoSomeShit();
}

展開後:

extern void TESTCASE_Fuck();
namespace vl_unittest_executors
{
class TESTCASE_RUNNER_Fuck
{
public:
static void RunUnitTest()
{
vl::unittest::UnitTest::PrintMessage(L"Fuck");
TESTCASE_Fuck();
}
TESTCASE_RUNNER_Fuck()
{
vl::unittest::UnitTest::PushTest(TESTCASE_RUNNER_Fuck::RunUnitTest);
}
} TESTCASE_RUNNER_Fuck_INSTANCE;
}
void TESTCASE_Fuck()
{
DoSomeShit();
}


這個問題搞了個大新聞,一顆賽艇,輪子哥竟然被說不懂c++,坐等輪子哥回應


宣傳工作又啟動了


百度搜下宏裡面# ##的用法


推薦閱讀:

如何解決光線跟蹤中浮點數誤差導致的渲染錯誤?
c++里有沒有類似python中list的結構?
本人熟悉window下C/C++開發,windows網路/多線程編程,怎麼快速轉到linux下做開發?
Python 和 C++ 如何選擇?

TAG:C | vczh知乎用戶 |