奶头挺立呻吟高潮av全片,成人试看120秒体验区,性欧美极品v,A片高潮抽搐揉捏奶头视频

C語言

有趣的C語言預處理

時間:2024-07-29 15:38:20 C語言 我要投稿
  • 相關推薦

有趣的C語言預處理

  #define和#include是最常用的預處理,單片機程序不用其他預處理也完全可行。所以初學者并不深究預處理的應用。下面是有趣的C語言預處理,歡迎閱讀了解。

  分類解釋

  在編譯器編譯之前,會首先搜索預處理指令,按照指令完成編譯,預處理又分為:文件包含、條件編譯、布局控制(雜注)和宏替換。

  文件包含:

  #include""和#include<>,前者是和該c文件相同目錄下的.h,如 #include "os_cfg.h" ,或指明路徑的.h,如 #include "softwareucos-iisourceucos_ii.h" ;

  后者是編譯器系統路徑中的.h,一般C語言標準庫函數在編譯器里集成,如 #include 。

  只要包含了.h,而.h里有函數聲明(或變量、結構體實例),那么不論這個函數(變量、結構體實例)在那個.c文件里定義的,都可以在主C文件中使用。

  對于函數,可以按功能分類成各種模塊,集合在一起寫成一個.c文件,然后作同名的.h給出函數聲明,如果模塊太多,也可以再用一個.h來包含各模塊的.h,uCOS-II中的includes.h就是這樣。

  對于變量,C模塊中的全局變量只對該模塊有效,如果想要被其他C文件訪問,就得在.h里聲明,如果主C包含了這個.h,那么此變量就成了真正全局的了。

  對于結構體實例,其結構的定義可以放在.h里,(如果不需要到處定義很多實例放在c里也可以),實例定義在c里,而聲明放在.h里,這樣就到處可用此實例了。

  #include 的對象直接被 插入到了該位置,所以可能出現#include重復甚至嵌套,用#ifndef...#define...代碼...#endif的方法可以保證重復包含的.h那個只在第一次出現時編譯.

  條件編譯:

  上面的#ifndef就是條件編譯的一種。條件編譯主要用于跳過某些代碼不編譯,這樣可以用來寫一個C文件,但是適應不同硬件版本,或者可采用不同算法。我就經常用多種算法寫同一個功能,#define method 1,#if methof==1...#endif, #if method ==2...#endif

  Protothread的神奇功能就是用宏和條件編譯來實現的。舉個例子:

  #define LC_INIT(s) s = 0;

  #define LC_RESUME(s) switch(s) { case 0:

  #define LC_SET(s) s = __LINE__; case __LINE__:

  #define LC_END(s) }

  #define PT_BEGIN(pt) { char PT_YIELD_FLAG = 1; LC_RESUME((pt)->lc)

  每個線程執行一次 PT_BEGIN(pt),這樣就創建了一個switch,一開始 pt->lc=0, PT_BEGIN(pt)之后繼續執行語句(本protothread的語句,一般是while(1)),執行到PT_WAIT_UNTIL(pt, condition)之類會調用LC_SET((pt)->lc);然后return,于是pt->lc記錄了行號,創建了case:,下次進到線程之直接走 LC_RESUME(s)里的switch到上次的位置

  布局控制/雜注:

  主要是#pragma,從實用的角度講,就是編譯器為了簡化用戶操作,給用戶提供了一些命令,不同編譯器是不一樣的,比如,IAR EW430就可以直接定義中斷函數而不用管中斷向量表在哪兒。(比如ARM7就要編譯前手動改程序段的中斷向量表,DSPF2812就要用程序指令改數據段的中斷向量表,而51則由keil自動放置中斷跳轉指令。)

  #pragma vector=PORT1_VECTOR

  __interrupt void Port_1(void)

  {

  //code

  }

  編譯器會自動給中斷函數指定中斷向量。

  宏替換:

  宏函數其實可以巧妙的代替函數,尤其是很短又沒有局部變量的一些語句,還可以代換很多復雜的格式,如

  #define F "%6.2f"

  #define F3 F " " F " " F" "

  用函數printf(F3,a,b,c),可以同時指定a,b,c 的格式

  其他:

  預定義標識符

  為了處理一些有用的信息,預處理定義了一些預處理標識符,雖然各種編譯器的預處理標識符不盡相同,但是他們都會處理下面的4種:

  __FILE__ 正在編譯的文件的名字

  __LINE__ 正在編譯的文件的行號

  __DATE__ 編譯時刻的日期字符串,例如: "25 Dec 2000"

  __TIME__ 編譯時刻的時間字符串,例如: "12:30:55"


【有趣的C語言預處理】相關文章:

C語言預處理知識11-26

C語言預處理概述03-30

c#中預處理指令#if的使用11-30

C語言考點精選03-18

C語言試題03-28

C語言的應用12-12

C語言的結構12-12

什么是C語言03-19

C語言試題(精選)12-05

主站蜘蛛池模板: 镇江市| 嫩江县| 崇明县| 繁峙县| 云安县| 新昌县| 岫岩| 滕州市| 西昌市| 武强县| 祥云县| 呼伦贝尔市| 化德县| 泸溪县| 泌阳县| 海南省| 渝北区| 叙永县| 全州县| 荣昌县| 阳朔县| 大余县| 华安县| 武平县| 平遥县| 石景山区| 揭东县| 天峨县| 克山县| 深州市| 西青区| 北海市| 榆树市| 棋牌| 得荣县| 仙游县| 舒兰市| 千阳县| 吴川市| 孙吴县| 罗江县|