[英]How do I interpret (assert) here in c?
void (assert)(int e)
{
assert(e);
}
它在這里如何運作?
void (assert)(int e)
等同於void assert(int)
你為什么需要它?
考慮下面的例子
#include<stdio.h>
void foo(int a)
{
printf("%d", a);
}
#define foo(a) {/*I do nothing*/}
int main()
{
foo(5); // won't call `foo`
}
您如何確定調用foo
,即調用的函數而不是在調用位置替換的宏定義?
解決方案是在括號中加上(foo)(5)
類似地, assert
已知是一個宏。 這就是我能想到的原因。
由於assert
已經被定義為函數式宏,沒有它會無論是在功能頭部和身體被擴大了括號。
例如:
#define twice(x) ((x)+(x))
void twice(int i)
{
return twice(i);
}
將擴展到以下內容,這顯然是不合法的
void ((int i)+(int i))
{
return ((i)+(i));
}
另一方面:
#define twice(x) ((x)+(x))
void (twice)(int i)
{
return twice(i);
}
將擴展為:
void (twice)(int i)
{
return ((i)+(i));
}
編譯器將忽略函數名稱周圍的多余括號。
這是在標准庫的源代碼中經常使用的常見技巧,在其他情況下,其中可能存在具有相同名稱的函數和宏。
這是合法的語法,只是用額外的括號寫出來。 之所以這樣做,是因為assert()
通常被定義為宏。 因此上面的函數可以使assert()
成為一個實函數,因此您可以在其中設置一個斷點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.