标题:对编译-加载文件方面的困惑
只看楼主
_ZDX_
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2016-3-4
结帖率:0
已结贴  问题点数:20 回复次数:9 
对编译-加载文件方面的困惑
我下到一个代码例程,它的工程(sms_main.dsp)打开目录显示是这样
sms_main files
├sms_delele.c
 ├sms_input.c
 ├sms_load.c
 ├sms_main.c
 ├sms_save.c
 └sms_struct.h
而在我的认知中,C语言工程是这样的
aaa files
├Source files
 │└main.c
 └Headers
   └main.h
我的想法,
编译器从main.c开始读入,遇到#include <main.h> #include <stdio.h>或 #include "XXX.c"来载入外部文件
最后从主函数(main)开始调用(运行程序)

但看了我下的那个例程,就有点晕了...
1.编译器究竟从哪个先加载啊?而且居然用sms_main.c代替了main.c(我确认了文件目录没有main.c文件)

目录下所有 *.c文件开头都看到了#include "sms_struct.h"
还有在#include "sms_struct.h"写了#ifndef防止重复加载
2.难道我写100个*.c文件,100个都要加这句?不能想办法只写一次吗?


[此贴子已经被作者于2016-3-4 14:44编辑过]

搜索更多相关主题的帖子: C语言 编译器 files include 运行程序 
2016-03-04 14:43
wp231957
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:神界
等 级:版主
威 望:422
帖 子:13681
专家分:53296
注 册:2012-10-18
得分:10 
谁和你说的 工程里必须要包含main.c啊   

DO IT YOURSELF !
2016-03-04 15:39
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
對編譯型語言,文件的次序是不重要的。

授人以渔,不授人以鱼。
2016-03-04 17:20
_ZDX_
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2016-3-4
得分:0 
回复 3楼 TonyDeng
就算不重要,终究有个判断次序的方法,我想知道那个。
如果不知道次序 extern在我心中就很诡异
2016-03-05 08:12
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
以下是引用_ZDX_在2016-3-5 08:12:15的发言:

就算不重要,终究有个判断次序的方法,我想知道那个。
如果不知道次序 extern在我心中就很诡异

是根本不需要次序。文件是在鏈接時構建的,不在編譯時。

授人以渔,不授人以鱼。
2016-03-05 08:15
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
但看了我下的那个例程,就有点晕了...
1.编译器究竟从哪个先加载啊?而且居然用sms_main.c代替了main.c(我确认了文件目录没有main.c文件)

第一,程序的入口函數main()不由文件名main.c決定,而是可以放在任何文件名的源代碼文件中,編譯器鏈接時會把編譯出來的main()函數目標代碼做爲入口點。第二,事實上可以通過編譯參數讓編譯器改變程序的入口函數名,即可以以非main()命名。

 目录下所有 *.c文件开头都看到了#include "sms_struct.h"
 还有在#include "sms_struct.h"写了#ifndef防止重复加载
2.难道我写100个*.c文件,100个都要加这句?不能想办法只写一次吗?

#include是預處理指令,在編譯之前調用預處理程序處理這部分指令(此時C語言的語法不起作用),這個預處理過程,僅僅是把指定的文本文件嵌入(是的,就是复製黏贴)到當前源代碼的當前行(即#include行)位置。100個.c文件有100個#include指令,這個動作就重複100次!

授人以渔,不授人以鱼。
2016-03-05 08:50
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
防止重複嵌入的#include,是指在某個.c模塊中,防止此文件多次被#include指令處理多次插入同樣的內容,這在某個.h中包含#include時會遇到,事實上很多.h都會#include另外的.h,而你寫#include時不會很清楚它包含別的什麽.h,那麽你就可能會多次包含同一個.h,哪怕你從來不知道那個.h叫什麽名字。

在不同的.c模塊中嵌入同一個.h,那是兩份獨立的代碼,彼此不相干的。100個.c中嵌入100次同一個.h,這些內容都與直接寫在那個.c中一樣。

extern是用於前期聲明,即在鏈接前不知道某個變量或函數的實際內容時按其類型假设編譯該變量或函數的尺寸,最終的裝配工作是由鏈接器完成的,此時會剔除從來沒用過的函數或變量。

授人以渔,不授人以鱼。
2016-03-05 09:02
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
C/C++是編譯型語言,不是執行.c的,更沒有從哪個.c開始按次序執行的説法。

授人以渔,不授人以鱼。
2016-03-05 09:12
_ZDX_
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2016-3-4
得分:0 
回复 8楼 TonyDeng
原本只知道动态语言和静态语言,原来还有编译型语言和解释型语言一说。
我感觉加载文件方面解决了。

我还有个问题关于extern这个关键字,我感觉学不懂extern

假如有1.c 2.c 3.c 4.c 5.c五个文件
有一个int型a; 我想让 1.c和 2.c通用一个a,3.c 4.c 5.c通用另一个a可以写出来么?怎么写。



2016-03-06 10:09
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
extern是指示本模塊引用了外部的東西。你這裏兩部分各自共用的外部變量,不能是同一個名字。

授人以渔,不授人以鱼。
2016-03-06 10:38



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-462144-1-1.html




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

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