簡體   English   中英

我如何在c中解釋(斷言)?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM