| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 735 人关注过本帖
标题:關於C/C++多文件編程
只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
结帖率:100%
收藏
 问题点数:0 回复次数:7 
關於C/C++多文件編程
C/C++支持多文件(文件亦稱模塊)的編程,即可以由多於一個的.c/.cpp文件構成一個程序。先看如下實驗:

在工作文件夾中,建立2個源代碼文件:

File1.cpp
程序代码:
#include <cstdio>

const int Value = 1;

void fun(void);

int main(void)
{
    printf_s("[File1] Value = %d\n", Value);
    fun();

    return 0;
}


File2.cpp
程序代码:
#include <cstdio>

const int Value = 2;

void fun(void)
{
    printf_s("[File2] Value = %d\n", Value);
}


編譯指令:
cl /MD file1.cpp file2.cpp /Fe:test
用指定的2個.cpp文件生成可執行文件test.exe。

執行test.exe,結果如下:
图片附件: 游客没有浏览图片的权限,请 登录注册


[ 本帖最后由 TonyDeng 于 2015-10-6 10:45 编辑 ]
2015-10-05 21:45
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
解析:

在模塊文件File1.cpp中,我們定義了一個可見域為文件級別的靜態常量Value,其値為1。
在模塊文件File2.cpp中,我們也定義了一個可見域為文件級別的靜態常量Value,其値為2。

這裡2個“全局”變量,名字是一樣的,但値不同,理應衝突,但事實上並非如此,不單編譯通過,而且運行的結果亦無誤,兩個常量的値都輸出來了,正是所期望的效果。你知道為什麼嗎?

[ 本帖最后由 TonyDeng 于 2015-10-5 22:00 编辑 ]

授人以渔,不授人以鱼。
2015-10-05 21:50
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
答案在“靜態全局變量”上。這樣在每個文件的函數外部定義的變量,其實省略了一個作用域關鍵字,那就是static。凡是這樣書寫的變量和數據,實質其可見性僅局限在當前模塊文件中,也就是說,衹有在這個.cpp文件中的函數及其內部調用的子函數,才能看見這種數據,在其他.cpp文件中,是看不到的。也就是說,這樣的數據名義上是“全局”,但實際上是模塊級別上的全局,並非程序級別上的。因此,每個.cpp模塊文件,都可以定義它自己的模塊內全局數據,並各不相干。

非但數據如此,連函數也如此!把1樓File1.cpp中的fun()函數原型刪掉,你會發現編譯出錯,此時報告“找不到標識符fun”,表明在File1.cpp中根本看不到在File2.cpp中定義的函數。

授人以渔,不授人以鱼。
2015-10-05 22:00
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
明白了2樓所說的,才會明白函數原型到底派什麼用。函數原型就是告訴編譯器,在當前的.cpp模塊中,將要使用一個如此這般的函數,但這個函數的定義代碼卻不在這個模塊,而在別的某個模塊中,現在先用著,到鏈接的時候,會把那個函數的實現代碼鏈過來供實際執行。這個機制,就是初學者經常碰到的一個問題:寫錯了函數的名字,編譯時報告找不到某個函數,因為編譯器所能找到的,全部跟聲明的不符,於是到最後才能告訴你“找不到”,此時在鏈接階段,而非編譯階段。

那麼,假如我們需要File1.cpp和File2.cpp使用同樣的一個全局數據,應該怎麼辦呢?

授人以渔,不授人以鱼。
2015-10-05 22:07
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
最後看如下實例:

Header.h
程序代码:
#pragma once

extern const int Value;
void fun(void);


File1.cpp
程序代码:
#include <cstdio>
#include <conio.h>
#include "header.h"

const int Value = 1;

void fun2(void);

int main(void)
{
    printf_s("[File1] Value = %d\n", Value);
    fun();
    fun2();

    _getch();
    return 0;
}


File2.cpp
程序代码:
#include <cstdio>
#include "header.h"

void fun(void)
{
    printf_s("[File2] Value = %d\n", Value);
}


File3.cpp
程序代码:
#include <cstdio>

const int Value = 3;

void fun2(void)
{
    printf_s("[File3] Value = %d\n", Value);
}


[ 本帖最后由 TonyDeng 于 2015-10-5 23:15 编辑 ]

授人以渔,不授人以鱼。
2015-10-05 23:13
qq912662412
Rank: 1
等 级:新手上路
帖 子:3
专家分:7
注 册:2015-10-3
收藏
得分:0 
2015-10-06 10:04
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
学习

能编个毛线衣吗?
2015-10-06 10:34
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
模塊級別的數據和函數,正是C語言可以模仿C++語言封裝的手段。一個C模塊等價於C++的類,後者public部分的東西,其實也是全局性的,不過局限在類中而已。作用域廣的數據,未必是壞事,畢竟可以簡化編程,祗要把區域規劃好即可,其實就算用C++的類機制,如果劃分不好,什麼數據都堆在public中,那也是一樣。問題不在語言,而在於設計。

用C也可以寫出面向對象的程序,這是例證。

授人以渔,不授人以鱼。
2015-10-06 10:54
快速回复:關於C/C++多文件編程
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.034783 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved