最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言進階(預(yù)處理命令詳解)

 更新時間:2025年07月25日 15:16:16   作者:大陽123  
文章講解了宏定義規(guī)范、頭文件包含方式及條件編譯應(yīng)用,強調(diào)帶參宏需加括號避免計算錯誤,頭文件應(yīng)聲明函數(shù)原型以便主函數(shù)調(diào)用,條件編譯通過宏定義控制代碼編譯,適用于測試與模塊化開發(fā)

1.宏定義

1.1不帶參宏

#define  PI   3.14

變量名盡量大寫

1.2帶參宏

定義方式:

#define  MAX(x, y)     x > y ? x : y

下面的代碼運行結(jié)果為15,顯然是錯誤的。

   #include <stdio.h>
   #define JISUAN(x, y, z)    x * y + z
   int main(void)
   {
       int a = 0;                                                                                                                                                 
       a = JISUAN(1 + 2,2 * 3,3 - 1);
       printf("%d",a);
   }     

給變量帶上括號,運行結(jié)果是,正確做法如下:運行結(jié)果為20。因此盡量給定義添加括號。避免計算錯誤。

   #include <stdio.h>
   #define JISUAN(x, y, z)    ((x) * (y) + (z))
   int main(void)
   {
       int a = 0;                                                                                                                                                 
       a = JISUAN(1 + 2,2 * 3,3 - 1);
       printf("%d",a);
   }     

帶參宏和函數(shù)的區(qū)別:

帶參宏函數(shù)
帶參宏沒有參數(shù)類型、返回值、函數(shù)類型 相關(guān)概念函數(shù)有參數(shù)類型、函數(shù)類型、返回值相關(guān) 概念
帶參宏只是代碼的替換,沒有調(diào)用傳參過 程函數(shù)有調(diào)用、傳參過程
帶參宏是在程序編譯時展開,代碼體積增 大函數(shù)是在程序運行過程中加載,代碼體積 不會增大
帶參宏沒有傳參過程,執(zhí)行效率高函數(shù)有傳參過程,需要調(diào)用、傳參產(chǎn)生資 源開銷
簡單的代碼想要封裝模塊,優(yōu)先帶參宏需要嚴謹?shù)拇a邏輯,多行代碼,考慮使 用函數(shù)

2.頭文件的包含

#include <stdio.h>
#include <string.h>
#include <math.h>
#include "head.h"

#include 包含一個文件,文件會在預(yù)處理編譯時展開。

<>:在系統(tǒng)目錄下查找該頭文件。

"":在當(dāng)前目錄下查找該頭文件,如果找不到再到系統(tǒng)目錄下查找頭文件。

2.1頭文件中的內(nèi)容

1.構(gòu)造數(shù)據(jù)類型的定義

2.全局變量的聲明

3.全局函數(shù)的聲明

4.宏定義

2.2工程結(jié)構(gòu)

main.c中負責(zé)主函數(shù)編寫

  • 功能代碼.c中主要負責(zé)功能函數(shù)的編寫
  • 功能代碼.h中主要負責(zé)聲明功能代碼.c中編寫的功能函數(shù)
  • 調(diào)用函數(shù)的文件只需加對應(yīng)函數(shù)的.h頭文件即可使用該函數(shù)

這么說可能有些不太好理解,我們來舉個例子吧:

我們先創(chuàng)建一個工程文件夾jisuan來進行輸入兩個數(shù)字的四則運算:

再在里面創(chuàng)建jia.c jia.h jian.c jian.h cheng.c cheng.h chu.c chu.h main.c,一個.c的功能文件必須對應(yīng)一個.h的頭文件聲明用來方便主文件的調(diào)用!這里main.c不需要頭文件。因為這里存放主函數(shù)。

創(chuàng)建好后分別對jia.cjian.c cheng.c chu.c函數(shù)進行編寫。

  • jia.c:
   #include<stdio.h>
   float jia(float x , float y)                                                                                                                                                     
         {
             return x + y;
         }
  • jian.c:
  #include <stdio.h>
   float jian(float x , float y)
         {
             return x - y;                                                                                                                                                          
         }
  • cheng.c:
  #include<stdio.h>                                                                                                                                                                
   float cheng(float x , float y)
         {
             return x * y;
         }
  • chu.c:
   #include<stdio.h>
   extern float chu(float x , float y)                                                                                                                                              
         {
             return x / y;
         }

接下來依次編寫他們的頭文件:

  • jia.h
 extern float jia(float x ,float y); 

jian.h

 extern float jian(float x ,float y); 
  • cheng.h
 extern float cheng(float x ,float y); 
  • chu.h
 extern float chu(float x ,float y); 

最后我們進行主函數(shù)的編寫:這里要注意一定要用#include"函數(shù)功能.h"來聲明定義的變量

  • main.c:
   #include<stdio.h>
   #include"jia.h"
   #include"jian.h"
   #include"cheng.h"
   #include"chu.h"
   
   int main(void)
   {
       float r1 = 0;
      float r2 = 0;
      float r3 = 0;
      float r4 = 0;
      float a = 0;
      float b = 0;
      scanf("%f %f",&a,&b);
      r1 = jia(a,b);
      r2 = jian(a,b);
      r3 = cheng(a,b);
      r4 = chu(a,b);
      printf("jia = %f\n",r1);
      printf("jian = %f\n",r2);
      printf("cheng = %f\n",r3);
      printf("chu = %f\n",r4);
      return 0;
  }  

ok,編寫工作完成,我們來對.c文件進行編譯:

編譯完成后就會出現(xiàn)一個可執(zhí)行文件main

我們試著運行一下:

輸入12和45,得出計算結(jié)果。

這里,我在想這不是跟我前一篇寫的函數(shù)里extern外部聲明一樣的嘛,只不過通過#include""展開函數(shù)聲明而已。但是在未來的項目中撰寫每個功能代碼和主函數(shù)的不是同一個人,為了方便撰寫主函數(shù)的人調(diào)用,采用這樣的方法是不錯的選擇。

3.條件編譯

關(guān)鍵字功能描述
#if如果條件為真則編譯后續(xù)代碼塊
#elif若前面的#if或#elif條件不成立,并且該條件成立,則編譯該部分的后續(xù)代碼塊
#else若前面的#if和#elif都不成立,則編譯該部分代碼塊
#endif結(jié)束一個條件編譯塊,必須要與#if,#ifdef,#ifndef聯(lián)用
#ifdef若某個宏被定義,則使用該部分代碼
#ifndef若某個宏沒被定義,則使用該部分代碼
#if 1
編譯此部分
#elif 
不編譯該部分
#else
#if 0
不編譯該部分
#elif 1
編譯該部分
#else
test
#if 0
不編譯該部分
#elif 0
不編譯該部分
#else
編譯該部分
#if 1
編譯該部分
#endif  結(jié)束此條件編譯
#if 0
不編譯該部分
#endif  結(jié)束此條件編譯

#ifdef與#ifndef一般在項目測試中使用,可以在編譯時于外部定義或不定義某個宏,以此來調(diào)用代碼。

  #include <stdio.h>
  #define JISUAN(x, y, z)    ((x) * (y) + (z))
  int main(void)
  {
      #ifdef  TEST
      printf("測試\n");
      #endif
      #ifdef  YINGYONG
      printf("應(yīng)用\n");
      #endif
      return 0;
  } 

如上述代碼,對其編譯gcc -D TEST l.c -o l 在編譯的時候在外部定義了TEST,則輸出測試

如果在外部定義YINGYONG 則輸出應(yīng)用。

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Sersync+Rsync實現(xiàn)觸發(fā)式文件同步實戰(zhàn)過程

    Sersync+Rsync實現(xiàn)觸發(fā)式文件同步實戰(zhàn)過程

    sersync是使用c++編寫,而且對linux系統(tǒng)文 件系統(tǒng)產(chǎn)生的臨時文件和重復(fù)的文件操作進行過濾。下面通過本文給大家分享Sersync+Rsync實現(xiàn)觸發(fā)式文件同步實戰(zhàn)過程,需要的朋友參考下吧
    2017-09-09
  • 使用c++實現(xiàn)OpenCV圖像橫向&縱向拼接

    使用c++實現(xiàn)OpenCV圖像橫向&縱向拼接

    這篇文章主要介紹了使用c++實現(xiàn)OpenCV圖像橫向&縱向拼接,文中有圖像拼接函數(shù),可以實現(xiàn)如“長圖拼接王”這類小程序的類似功能,大家可以將該函數(shù)封裝在軟件中自由使用
    2021-08-08
  • C語言完數(shù)的實現(xiàn)示例

    C語言完數(shù)的實現(xiàn)示例

    C語言中的完數(shù)指的是一個正整數(shù),本文主要介紹了C語言完數(shù),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • c語言尾隊列tailq使用示例分享

    c語言尾隊列tailq使用示例分享

    這篇文章主要介紹了c語言尾隊列tailq使用示例,大家參考使用吧
    2014-01-01
  • C++提取文件名與提取XML文件的方法詳解

    C++提取文件名與提取XML文件的方法詳解

    這篇文章主要為大家詳細介紹了C++提取文件名與提取XML文件的方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助<BR>
    2022-03-03
  • C++中指針和引用的區(qū)別詳解

    C++中指針和引用的區(qū)別詳解

    這篇文章主要介紹了C++中指針和引用的區(qū)別詳解的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • C++ 泛型編程詳解

    C++ 泛型編程詳解

    這一篇介紹一下 C++ 編程中與面向?qū)ο蟛⒘械牧硪淮蠓种А盒途幊?,這一篇主要介紹函數(shù)模板、類模板和成員模板三大部分,需要的朋友可以參考下
    2020-02-02
  • Qt4和Qt5的信號和槽的使用區(qū)別

    Qt4和Qt5的信號和槽的使用區(qū)別

    本文主要介紹了Qt4 和 Qt5 的信號和槽的連接 connect 與斷開 disconnect 區(qū)別,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C++11中的可變參數(shù)模板/lambda表達式

    C++11中的可變參數(shù)模板/lambda表達式

    C++11的新特性可變參數(shù)模板能夠讓我們創(chuàng)建可以接受可變參數(shù)的函數(shù)模板和類模板,相比C++98和C++03,類模板和函數(shù)模板中只能含固定數(shù)量的模板參數(shù),可變參數(shù)模板無疑是一個巨大的改進,這篇文章主要介紹了C++11中的可變參數(shù)模板/lambda表達式,需要的朋友可以參考下
    2023-03-03
  • C/C++中的靜態(tài)變量注意事項

    C/C++中的靜態(tài)變量注意事項

    本文主要介紹了C/C++中的靜態(tài)變量注意事項,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07

最新評論

浦北县| 大英县| 昌乐县| 辛集市| 柯坪县| 宜春市| 葵青区| 林芝县| 英德市| 蒙阴县| 六安市| 岑巩县| 林周县| 内黄县| 钦州市| 徐州市| 积石山| 石河子市| 无棣县| 吉安市| 兴海县| 涿州市| 十堰市| 阿鲁科尔沁旗| 广德县| 乳山市| 宁南县| 齐齐哈尔市| 舟曲县| 壶关县| 太湖县| 乐平市| 阳城县| 甘孜| 宁河县| 云霄县| 阜城县| 翁牛特旗| 马公市| 商水县| 嵊州市|