2
這是我發現這個單行宏函數'static_assert'是做什麼的?
static_assert(sizeof(struct File) == 256);
的宏定義的代碼是這樣的:
#define static_assert(x) switch (x) case 0: case (x):
- 這是如何執行的斷言?
- 爲什麼不使用常規的assert()函數?
這是我發現這個單行宏函數'static_assert'是做什麼的?
static_assert(sizeof(struct File) == 256);
的宏定義的代碼是這樣的:
#define static_assert(x) switch (x) case 0: case (x):
這會通過觸發編譯時錯誤來執行assert
。考慮以下代碼:
switch(0) case 0: case 0:
編譯器會告訴你,你有重複case
標籤,因爲零列出兩次。如果,另一方面,你將任意數量比代替x
爲零,你會得到
switch(1) case 0: case 1:
這是完全合法的,並且不會引發編譯時錯誤。
與運行時發生的常規assert
不同,此聲明發生在編譯時。換句話說,如果常規斷言是錯誤的,程序就會崩潰;如果這個斷言是錯誤的,程序甚至不會編譯。
靜態斷言用於在編譯時作出斷言 – Rabbid76
只有問題的第二部分與重複相關。第一部分(它是如何工作的)不是所假設的重複問題的一部分,也沒有在任何答案中解釋。 – dasblinkenlight