C 巨集定義的函式如何呼叫

2025-07-24 05:50:18 字數 3006 閱讀 2263

1樓:風若遠去何人留

帶引數的巨集定義,也稱為巨集函式,即巨集定義的函式。

呼叫方法和普通函式是相同的,即。

函式名(引數列表)

的方式進行呼叫。

與普通函式不同的是:

1 巨集定義中,不存在引數型別,所以也不會對呼叫時的引數做型別檢查,需要程式設計者自行注意。

2 巨集定義不會產生棧操作,而是直接將巨集函式內容替換到呼叫位置。所以對於引數要格外小心。

在c++中,行內函數(inline)的出現就是取代巨集函式的,相對巨集函式,行內函數更不容易出錯,也更容易理解。所以在c++中,巨集函式已經用的很少了。

2樓:網友

a=min(c,d);

會被翻譯成。

a =else};

這樣的乙個語句你試試可以通過嗎?

define都是**替換,所以建議你用樓上的方法。

c++函式里面可以使用巨集定義嗎

3樓:網友

一般都是在函式外定義,中函式里定義作用域小,有可能會重名,不提倡。

4樓:網友

函式里可以使用巨集,但一般寫程式都放在前面。如果放在函式里則巨集的作用域較小,在定義巨集之前不能使用該巨集,而且改變該巨集的值時不容易找到。

例:#include ""

int fun(int a);//函式宣告int main()

int fun(int a)

結果為:25

所以說在函式中可以使用巨集。

再如:#include ""

int fun(int a);//函式宣告int main()

int fun(int a)

所以函式中定義的巨集的作用域較小,只有在定義的後面可以使用。

總結:建議寫程式時把用到的巨集都放到前面,而且該變巨集的值時也很容易找到。

c語言裡巨集定義能在主函式里寫嗎?

5樓:難得當歌對酒時

這個屬於前處理器的工作,沒什麼全域性,區域性的概念,只要是這條語句之後的就受其影響,之前的就不受,編譯程式那裡這些東西已經全部替換掉了。

6樓:曹糯糯

當然可以,巨集定義是預處理的。在什麼地方寫都可以。

編譯器只是把巨集定義的作替換。定義好的巨集,在真正編譯的時候被所定義的塊給替換了。

7樓:網友

#define這種預編譯指令在哪寫都可以。

建議你去看看預編譯的知識,對這個多一點了解,網上就有很多的。

c++巨集定義不允許呼叫函式,有沒有辦法突破這個限制?

8樓:網友

暈,我怎麼不知道c++還有這規定?

巨集定義是預處理階段進行的文字替換,它都還沒有函式的概念,怎麼就能不允許調呢?

看樣子俺c用久了,都不知道現在c++有這麼先進了,預處理階段就開始語義分析了。

9樓:高尾山

c++巨集定義允許呼叫函式,寫巨集定義時在函式名和變數名上下點功夫。

c++中,巨集定義和呼叫函式同時存在,主函式執行哪個?

10樓:網友

看主函式呼叫了哪個呀,呼叫巨集,就執行巨集,呼叫子函式,就執行子函式,2個都呼叫的話,就都執行。

11樓:花花浪客

如果巨集與呼叫函式重名了的話,這種情況編譯無法通過。

你始終記住巨集實際上就是在編譯的時候進行替換,不管巨集與函式是否同時存在,反正你把巨集定義的那個名字在所有出現的地方替換進去看看是否是正確的就知道了。

比如你定義。

#define max(a, b) (a) >b) ?a): b))

再來int max(int a, int b)那麼就是。

int ((int a) >int b) ?int a): int b))

自己很容易判斷這個肯定編譯不過了。

c語言巨集定義函式如何呼叫(裡面含引數可以當函式用嗎)

12樓:魔方格的故事

使用巨集函式或者巨集函式時,注意如下幾點:

1.巨集函式的引數沒有型別,前處理器只負責做形式上的替換,而不做引數型別檢查,所以傳參時要格外小心。

2.巨集函式定義要注意格式,尤其是括號。

如果上面的巨集函式寫成 #define max(a, b) (a>b?a:b),省去內層括號,則巨集就成了k = (i&0x0f>j&0x0f?

i&0x0f:j&0x0f),運算的優先順序就錯了。同樣道理,這個巨集定義的外層括號也是不能省的。

若函式中是巨集替換為 ++max(a,b),則巨集就成了 ++a)>(b)?(a):(b),運算優先順序也是錯了。

3.巨集函式往往會導致較低的**執行效率。

若是普通函式,則通過遞迴,可取的最大值,時間複雜度為o(n)。但若是巨集函式,則巨集為( a[n]>max(n-1)?a[n]:

max(n-1) )其中max(n-1)被呼叫了兩遍,這樣依此遞迴下去,時間複雜度會很高。

13樓:網友

巨集定義,不能當函式使(函式中的return是返回到呼叫點,而巨集中的return卻是從呼叫點跑開了)

你的**,在編譯時會進行巨集替換,真正的**變成了如下:

#include

#define a(b,c)

int main()

本身這句也有問題,return後跟的printf()永遠不會執行!

return 0;}

14樓:橙心橙願

可以啊,不過#define a(b,c)其中的return d;最好去掉,因為巨集是直接貼到用呼叫處的,相當於。

int main()

還沒printf就return了,列印不出來了。

15樓:網友

不可以吧,函式執行的時候,遇到return就返回了,這個定義是不成功的。而且這樣定義完全沒有必要,可以定義子函式來實現。

matlab 如何建立 呼叫自定義函式

新建一個m檔案 在m檔案裡面第一行輸入function x,y pll x1,y1,x2,y2 這裡x1 x2 y1 y2是你函式的輸入值,x y是輸出值,接著定義你要實現的功能,比如 x x1 x2 y y1 y2 接著儲存這個m檔案,注意!這個m檔案的名字必須是定義的函式的名字,即儲存為pll....

C中如何呼叫靜態類中的建構函式

靜態建構函式既沒有訪問修飾符,也沒有引數。如果沒有編寫靜態建構函式,而這時類中包含帶有初始值設定的靜態欄位,那麼編譯器會自動生成預設的靜態建構函式。在建立第一個類例項或任何靜態成員被引用時,net將自動呼叫靜態建構函式來初始化類,也就是說我們無法直接呼叫靜態建構函式,也就無法控制什麼時候執行靜態建構...

c語言 函式的定義的小問題,C語言 函式的定義的小問題

注意這個函式的兩點 第一個引數是char,什麼是char?在32位的機器上,char可以看成1個位元組的整數,a b 這樣的asii字元是char,a選項中的 abc c選項中的 65 都不是char,實際上他們什麼都不是,所以排除ac 第二,返回是void的。那麼b取了函式的返回值,所以b也是錯誤...