91视频免费?看_蜜芽MY188精品TV在线观看_国产免费无遮挡在线观看视频_深夜国产_亚洲精品欧洲精品_欧美黑人粗暴多交

一口Linux
認證:優質創作者
所在專題目錄 查看專題
C語言中的短路現象
看了這幾個C語言例子,你一定和我一樣連說5個臥槽,聲音一次比一次大
什么是狀態機?用C語言實現進程5狀態模型
C語言操作時間函數,實現定時執行某個任務小程序
C語言:static的一個很實用的小技巧
C語言static關鍵詞詳解
作者動態 更多
某通信公司筆試題,你會做幾道?
2天前
10種初學者最常見的c語言段錯誤實例及原因分析
05-30 12:13
linux系統監控工具小神器:btop
05-17 17:37
有沒有權貴開后門讓子女做軟件開發人員?
05-10 23:36
一文包你學會網絡數據抓包
03-15 09:26

C語言:static的一個很實用的小技巧

問題描述:

某個函數fun_1()是在lib內,沒法修改的,在程序中大量的使用了該函數,現在想把原本fun_1失效(現在失效的方法是#define fun_1(..)),用另外一個函數fun_2(),可是fun_2最后也需要調用fun_1,上面的失效方法感覺就不行了,請問怎么做才對?

粉絲提問

粉絲提問,必須安排!一口君實力寵粉!

想學習C語言、Linux、驅動、ARM的同學可以加一口君微信,拉你進群。

我把問題簡單整理下:

問題

  1. 我們庫文件里有個函數是read()
  2. 我們現在要自己定義一個名字一樣的函數read(),
  3. main()函數首先調用我們自己定義的函數read()
  4. 自己定義的函數,要再定義庫文件中的read()函數。

問題就出在如何讓我們自己定義的read()函數只調用lib庫中的read函數,而不會調用自己。

解決思路-static

如果我們要使用一個和庫函數相同名字的函數,就要借助static關鍵字。

在函數的返回類型前加上static,就是靜態函數。其特性如下:

  1. 靜態函數只能在聲明它的文件中可見,其他文件不能引用該函數
  2. 不同的文件可以使用相同名字的靜態函數,互不影響
  3. 其他庫如果有相同的函數名,優先使用本文件的靜態函數

舉例

系統調用函數read(),定義如下:

read

現在我們想定義一個自己的函數,名字也是read,要如何操作呢?

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

static void read()
{
 printf("my read func()\n");
} 
int main()
{
 read();
}
 

執行結果

我們可以看到,雖然我們添加了系統調用read()的頭文件,但是調用的是我們自己定義的read()函數。

下面我們來看下,如果我們定義的read函數又想調用系統調用read()函數應該怎么辦呢?那就必須再增加一個文件,把相關功能放到另外一個文件中,在同一個文件中是沒有辦法實現的。

上代碼,沒有論據的知識點都是耍流氓。【一口君絕大部分文章都是有實例代碼支撐】

/test.c
  1 #include <stdio.h>                                                                                                     
  2 #include <sys/types.h>
  3 #include <sys/stat.h>
  4 #include <fcntl.h>
  5 
  6 
  7 void test()
  8 {
  9     int fd;
 10     char buf[128]={0};
 11 
 12     fd = open("123.c",O_RDWR);
 13     if(fd<0)
 14     {
 15         perror("open fail\n");
 16         return;
 17     }
 18     read(fd,buf,16);
 19     printf("enter test():%s\n",buf);
 20 }

//123.c
  1 #include <stdio.h>                                                                                                     
  2 #include <sys/types.h>
  3 #include <sys/stat.h>
  4 #include <fcntl.h>
  5 
  6 extern void test();
  7 static void read()
  8 {
  9     printf("my read func()\n");
 10     test();
 11 }
 12 int main()
 13 {
 14     read();
 15 }

執行結果

由執行結果可知,程序既調用到了我們自己調用的read()函數,也調用到了系統調用函數read().

函數調用順序如下:

調用順序 

問題解決了,你學到了嗎?

聲明:本內容為作者獨立觀點,不代表電子星球立場。未經允許不得轉載。授權事宜與稿件投訴,請聯系:editor@netbroad.com
覺得內容不錯的朋友,別忘了一鍵三連哦!
贊 3
收藏 1
關注 181
成為作者 賺取收益
全部留言
0/200
  • 天賜時間 2020-12-08 09:27
    實力寵粉,解決問題
    回復
  • 川理學子 2020-12-07 00:13
    static函數有時候確實有妙用,單片機里面想要某個變量只初始化一次也可以用它,哈哈哈
    回復 1條回復
主站蜘蛛池模板: 驻马店市| 凯里市| 遂宁市| 彰化县| 罗山县| 辰溪县| 平乐县| 钦州市| 仙桃市| 鄂托克前旗| 青岛市| 东乌| 萍乡市| 黄浦区| 石门县| 库车县| 宜宾县| 四平市| 香河县| 全南县| 秀山| 建瓯市| 乌鲁木齐县| 郑州市| 星子县| 普宁市| 洛南县| 广宗县| 连云港市| 贡觉县| 敦煌市| 来安县| 浦东新区| 睢宁县| 曲麻莱县| 德格县| 长海县| 桃源县| 青州市| 都昌县| 辽阳县|