1. 程式人生 > >巨集和函式的區別

巨集和函式的區別

//1.使用巨集實現兩個數中求較大值。

#include<stdio.h>
#include<stdlib.h>
#define MAX(x,y) ((x)>(y))?(x):(y)
int main()
{
   printf("max=%d\n", MAX(1020));
   system("pause");
   return 0;
}

巨集和函式區別?

1.巨集會在編譯器在對原始碼進行編譯的時候進行簡單替換,不會進行任何邏輯檢測,即簡單程式碼複製而已.

2.巨集進行定義時不會考慮引數的型別.也就不夠嚴謹。

3.引數巨集的使用會使具有同一作用的程式碼塊在目標檔案中存在多個副本,即會增長目標檔案的大小.

4.引數巨集的執行速度會比函式快,因為不需要引數壓棧/出棧操作.

5.引數巨集在定義時要多加小心,多加括號.

6.函式只在目標檔案中存在一處,比較節省程式空間.

7.函式的呼叫會牽扯到引數的傳遞,壓棧/出棧操作,速度相對較慢.

8.函式的引數存在傳值和傳地址(指標)的問題,引數巨集不存在.
9.巨集不可以除錯,函式可以除錯。
10.巨集的引數可以出現型別,但是函式做不到。
如:

#defineMALLOC(num, type)\
         (type *)malloc(num * sizeof(type))
         MALLOC(10, int);//型別作為引數
//前處理器替換之後:
(int*)malloc(10* sizeof(int));

例子:
下面這個巨集定義會出錯:

#include <stdio.h>
#define SQUARE( x ) x * x
int main()
{
  int a = 5;
  printf("%d\n",SQUARE( a + 1) );
  return 0;
}

乍一看,你可能覺得這段程式碼將列印36這個值。
事實上,它將列印11.
為什麼呢?
替換文字時,引數x被替換成a + 1,所以這條語句實際上變成了:
printf (“%d\n” ,a + 1 * a + 1 );
因此建議巨集定義時加上括號。避免在使用巨集時由於引數中的操作符或鄰近操作符之間不可預料的相互作用。

注意:
1 . 巨集引數和#define 定義中可以出現其他#define定義的變數。但是對於巨集,不能出現遞迴。
2 . 當前處理器搜尋#define定義的符號的時候,字串常量的內容並不被搜尋。

#和##

#
把一個巨集引數變成對應的字串。


#define PRINT(FORMAT, VALUE)\
        printf("the value of "#VALUE "is "FORMAT "\n", VALUE);
        int main()
        {
         int a= 10;
         PRINT("%d", a);//產生了什麼效果?
         return 0;
         }
程式碼中的 #VALUE 會前處理器處理為: "VALUE" . 
最終的輸的結果應該是:
the value of a is 10

##的作用

##可以把位於它兩邊的符號合成一個符號。
它允許巨集定義從分離的文字片段建立識別符號。
注意:
這樣的連線必須產生一個合法的識別符號。否則其結果就是未定義的。

以上

相關推薦

巨集函式區別以及巨集的一些簡單用法介紹

巨集和函式的區別 巨集的定義:#define 機制包括了一個規定,允許把引數替換到文字中,這種實現通常稱為巨集(macro),或者定義巨集(define macro)。 函式:它負責完成某項特定任務

【C語言】巨集函式區別

由之前的巨集的引入我們知道,巨集函式可以完成一些簡單的運算。那是不是巨集函式就可以取代函式呢?巨集函式和函式到底有哪些區別呢? 下面我們來分析他們其中的區別。 1.程式碼長度:   對於巨集,每次使用時,巨集程式碼都被插入到程式中。除了非常小的巨集之外,程式的長度將大幅度增

巨集函式區別

//1.使用巨集實現兩個數中求較大值。 #include<stdio.h> #include<stdlib.h> #define MAX(x,y) ((x)>(y))?(x):(y) int main() { print

毒瘤header(程式碼裡的巨集函式看不懂可以來這裡找)

實際上大多都是從別人程式碼裡偷來的 #include <bits/stdc++.h> using namespace std; typedef double lf; typedef long long ll; typedef long double llf; typedef vector<

FreeMarker(五)巨集函式的定義

巨集和函式的異同: 巨集指的是<#macro>,函式指的是<#function>,都允許設定引數,內部可以包含流程控制語句。 區別如下: 巨集內部的Html程式碼會直接顯示在頁面上,更適合用來封裝一些頁面元件,巨集不允許有返回值,

C++中的巨集函式名稱的衝突 STL+windows.h

最近在寫程式碼的時候總是發現在#include"windows.h"了以後經常用STL中的min.max函數出現編譯錯誤。但是自認為程式碼是沒有錯誤的。下面就是相關的程式碼: // testMacro.cpp : Defines the entry point for th

巨集定義函式呼叫的區別

含引數的巨集與函式的區別 ?         巨集替換不佔執行時間,只佔編譯時間;而函式呼叫則佔執行時間(分配單元、保留現場、值傳遞、返回),所以每次執行都要載入所以執行起來比較慢一些。。 ?         定義巨集的時候不要在巨集及其引數之間鍵入空格,因為巨集替換的時候會把你不經意打的空格當作巨集的一部

C語言類函式巨集一般函式區別

類函式巨集:function-like-macro 用#define使用引數來定義巨集,巨集的引數用圓括號括起來,可以使一個引數或者多個引數,然後在使用的過程中這些引數將會被替換。 例如: #define SQUARE(X) X*X //定義類函式巨集 z = SQUAR

巨集函式函式區別及其優缺點

巨集定義,編譯預處理指令,在編譯預處理時即進行簡單的字元替換,也只進行簡單的字元替換。而巨集定義的函式和使用者定義的函式在使用時有什麼區別?如下: 1.巨集函式會在編譯預處理時展開,只佔編譯時間,函式呼叫則會佔用執行時間(分配單元,儲存現場,值傳遞,返回),每次執行都要載入

巨集函式函式區別及優缺點

區別 測試用例: 巨集函式:#define MAX(a,b) ((a)>(b)?(a):(b)) 普通函式:MAX(a,b) {return a>b?a:b} 1.巨集做的是簡單的字串的替換,而函式是引數的傳遞,引數是有資料型別的。 2.巨集的引數替換是直接替換

MySQL儲存過程函式區別與優缺點

為什麼要使用儲存過程和函式 資料庫物件儲存過程和函式,是用來實現一組關於表操作的SQL語句程式碼當做一個整體來執行。一個完整的操作會包含多條SQL語句,在執行過程中需要根據前面的SQL語句來執行結果有選擇的執行後面的SQL語句。 儲存過程和函式可以簡單的理解為一條或多條SQL語句的集合

java面試問題:oracle儲存過程(procedure)函式(function)的區別

oracle儲存過程(procedure)和函式(function)的區別 儲存過程 函式 用於在資料庫中完成特定的操作或者任務(如插入、刪除等) 用於特定的資料(如選擇)

python3:__new____init__魔法函式區別

這兩個魔法函式是最容易混淆,面試官也經常會問到的知識點。咱們掌握區別以及原理, 就可以自信說:來呀,我不怕. class User: def __new__(cls, *args, **kwargs): print("new") def __ini

C++中巨集函式區別

巨集在編譯時就被替換成它內部的語句了,而函式是執行時呼叫的 所以如果是簡單的東西就寫成巨集,這樣沒有呼叫函式的開銷,效率會高一些。相反,由於巨集每被呼叫一次,就相當於把程式碼複製一份,所以如果比較複雜的巨集被多次呼叫的話,會增加程式碼的體積。因此,太複雜的運算就寫成函式比較好了。 另外,要注意在巨集

巨集實現函式—1.寫一個巨集可以將一個數字的奇數位偶數位交換 2.求兩個數中求較大值

 交換奇數位和偶數位的方法: 1.奇數位與1偶數位與0得到奇數位 num&0101 0101 0101 0101 0101 0101 0101 0101  2.奇數位與0偶數位與1得到偶

含引數的巨集函式、行內函數的區別

含引數的巨集與函式的區別 1、巨集替換不佔執行時間,只佔編譯時間;而函式呼叫則佔執行時間(分配單元、保留現場、值傳遞、返回),每次執行都要載入,所以執行起來比較慢一些。 2、 定義巨集的時候不要在巨集及其引數之間鍵入空格,因為巨集替換的時候會把你不經意打的空格當作巨集的一部分進去

《6.C語言巨集定義與預處理、函式函式庫》

《6.C語言巨集定義與預處理、函式和函式庫》 第一部分、章節目錄 4.6.1.C語言預處理理論 4.6.2.C語言預處理程式碼實戰 4.6.3.巨集定義1 4.6.4.巨集定義2 4.6.5.函式的本質 4.6.6.函式的基本使用 4.6.7.遞迴函式 4.6.8.函式庫 4.6.9.字

C語言巨集定義巨集定義函式

轉自:http://blog.sina.com.cn/s/blog_861912cd0100tc94.html 要寫好C語言,漂亮的巨集定義是非常重要的。巨集定義可以幫助我們防止出錯,提高程式碼的可移植性和可讀性等。   在軟體開發過程中,經常有一些常用或者通用的功能或者程式碼段,這些功能既

函式表示式()()函式宣告function的區別

區分函式表示式和函式宣告的區別在於function的位置,如果function不是出現在一段函式的第一個詞,那麼這是一個函式表示式,若function是第一個詞,則是一個函式宣告。函式宣告和函式表示式的區別有哪些呢?我們來看下面這一段程式碼: var a = 2; func

Scala基礎02-Scala方法函式及其區別

Scala運算子及函式和方法的呼叫 但有一點特別的:這些操作符在scala中實際上是方法。例如: a + b 是如下方法呼叫的簡寫: a.+(b) a 方法 b可以寫成 a.方法(b)。 方法的呼叫(2.後面按下table,會有以下相關提示) 定義方法和