網站首頁 編程語言 正文
一、函數的由來
二、模塊化程序設計
三、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
相關推薦
- 2022-10-20 C語言手寫集合List的示例代碼_C 語言
- 2022-10-28 Python利用Rows快速操作csv文件_python
- 2022-07-15 python向量化與for循環耗時對比分析_python
- 2023-02-12 react-router-domV6嵌套路由實現詳解_React
- 2022-02-14 flutter封裝自定義打印信息
- 2022-12-14 Go語言defer的一些神奇規則示例詳解_Golang
- 2022-07-15 C語言函數棧幀的創建與銷毀原理圖解_C 語言
- 2023-10-12 利用touch-action解決驗證碼滑塊滑動時,背景跟隨一起滑動的問題,以及詳解touch-act
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支