日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C語言深入探究函數的溯源_C 語言

作者:清風自在?流水潺潺 ? 更新時間: 2022-06-17 編程語言

一、函數的由來

二、模塊化程序設計

三、C 語言中的模塊化

四、面向過程的程序設計

  • 面向過程是一種以過程為中心的編程思想
  • 首先將復雜的問題分解為一個個容易解決的問題
  • 分解過后的問題可以按照步驟一步步完成
  • 函數是面向過程在 C 語言中的體現
  • 解決問題的每個步驟可以用函數來實現

五、聲名和定義

  • 聲明的意義在于告訴編譯器程序單元的存在
  • 定義則明確指示程序單元的意義
  • C 語言中通過 extern 進行程序單元的聲明
  • 一些程序單元在聲明時可以省略 extern

????????嚴格意義上的聲明和定義并不相同!

? ? ? ? 下面看一個例子:

? ? ? ? test.c:

#include <stdio.h>
#include <malloc.h>
 
extern int g_var;    //聲明
extern struct Test;    //聲明
 
int main()
{
    extern void f(int i, int j);    //聲明
    extern int g(int x);    //聲明
    
    struct Test* p = NULL; // (struct Test*)malloc(sizeof(struct Test));
    
    printf("p = %p\n", p);
    
    //g_var = 10;
    
    printf("g_var = %d\n", g_var);
    
    f(1, 2);
    
    printf("g(3) = %d\n", g(3));
    
    free(p);
    
    return 0;
}

? ? ? ? global.c:

#include <stdio.h>
 
/*下面都是定義*/
int g_var = 10;
 
struct Test
{
    int x;
    int y;
};
 
void f(int i, int j)
{
    printf("i + j = %d\n", i + j);
}
 
int g(int x)
{
    return (int)(2 * x + g_var);
}

? ? ? ? ?輸出結果如下:

? ? ? ? 怎么證明聲明和定義不同呢?我們對 test.c 修改成這樣,將 struct Test* p = NULL;? 改成 struct Test* p = (struct Test*)malloc(sizeof(struct Test));

#include <stdio.h>
#include <malloc.h>
 
extern int g_var;
 
extern struct Test;
 
int main()
{
    extern void f(int i, int j);
    extern int g(int x);
    
    struct Test* p = (struct Test*)malloc(sizeof(struct Test));
    
    printf("p = %p\n", p);
    
    //g_var = 10;
    
    printf("g_var = %d\n", g_var);
    
    f(1, 2);
    
    printf("g(3) = %d\n", g(3));
    
    free(p);
    
    return 0;
}

? ? ? ? 可以看到,直接報錯:

delphi@delphi-vm:~$ gcc test.c global.c
test.c:6: warning: useless storage class specifier in empty declaration
test.c: In function ‘main’:
test.c:13: error: invalid application of ‘sizeof’ to incomplete type ‘struct Test’?

? ? ? ? 這是因為編譯器在?test.c 是找不到 struct Test 的定義的,只有? struct Test 的聲明,因此無法知道 struct Test 結構體的信息。(C 語言編譯器編譯 C 文件的時候不會依賴于文件之間的編譯順序)。

六、小結

  • 函數是面向過程思想在 C 語言中的體現
  • 面向過程是由上至下分解問題的設計方法
  • 程序中的定義和聲明完全不同
  • C 語言中通過 extern 對程序單元進行聲明

原文鏈接:https://blog.csdn.net/weixin_43129713/article/details/124140851

欄目分類
最近更新