2015-12-26 36 views
2

這是我發現這個單行宏函數'static_assert'是做什麼的?

static_assert(sizeof(struct File) == 256); 

的宏定義的代碼是這樣的:

#define static_assert(x) switch (x) case 0: case (x): 
  1. 這是如何執行的斷言?
  2. 爲什麼不使用常規的assert()函數?
+0

靜態斷言用於在編譯時作出斷言 – Rabbid76

+0

只有問題的第二部分與重複相關。第一部分(它是如何工作的)不是所假設的重複問題的一部分,也沒有在任何答案中解釋。 – dasblinkenlight

回答

8

這會通過觸發編譯時錯誤來執行assert。考慮以下代碼:

switch(0) case 0: case 0: 

編譯器會告訴你,你有重複case標籤,因爲零列出兩次。如果,另一方面,你將任意數量比代替x爲零,你會得到

switch(1) case 0: case 1: 

這是完全合法的,並且不會引發編譯時錯誤。

與運行時發生的常規assert不同,此聲明發生在編譯時。換句話說,如果常規斷言是錯誤的,程序就會崩潰;如果這個斷言是錯誤的,程序甚至不會編譯。