導航:首頁 > 源碼編譯 > c文件編譯時會查找所有c文件嗎

c文件編譯時會查找所有c文件嗎

發布時間:2022-06-08 16:11:27

① c語言實驗:查找c盤中的所有文件夾,對於子文件夾中的文件也要進行查找輸出。

優化了一下,但還是有bug,需要細查
#include<io.h>
#include<stdio.h>
#include<string.h>
#define_A_SUBDIR0x10/*Subdirectory*/

voidsearch(char*str1)
{
longflag1=0;
longhandle1;
chars1[]="\",s2[]="*.*",s3[100],name[100];
struct_finddata_tffblk1;

strcat(str1,s1);strcpy(s3,str1);strcat(str1,s2);
handle1=_findfirst(str1,&ffblk1);
while(!flag1)
{
if(strcmp(ffblk1.name,".")&&strcmp(ffblk1.name,".."))
{
if(ffblk1.attrib==_A_SUBDIR){
printf("%sisasub-directory ",ffblk1.name);
strcpy(name,ffblk1.name);
strcat(s3,name);
search(s3);
}
else{
printf("%s ",ffblk1.name);
}
}
flag1=_findnext(handle1,&ffblk1);
}
}

voidmain()
{
// struct_finddata_tffblk;
charstr[200]="C:";//必須是數組,不然空間不夠
search(str);
}

② c語言中多個文件的編譯問題

第一個問題
請問,我是不是該這樣做:
在main.c中#include
在fun.c中同樣#include
(好像是必需的,請詳細解釋)
這是必需的。因為編譯器只是把包含文件的代碼復制過來,既然你二個文件中都用到頭文件的內容,那當然要包含頭文件,否則就會出錯。
我的觀點,如果這兩步都是必需的
那麼當有很多個比如10個.c程序每個里頭都要#include
那麼文件是不是會特別大,當有100個.c程序都要包含一下的話,那麼不是非常重復么?)
那當然是會重復的。不過這個對程序的運行效率沒任何影響,只是在編譯過程中對文件的分析時間會稍長些,這也是沒有辦法的事,全看代碼編寫者如何組織結構了。
第二個問題:
會的。解決的方法就是在可能被多次包含的頭文件中開頭加上#pragma
once,那樣就可以保證此頭文件代碼只被執行一次,而不會造成頭文件中函數多次重復定義至於引起這種情況的情況。當然你也可以自己用#ifdef等預編譯處理來解決。你問的問題不就是這種情況么?main.c和fun.c中都包含頭文件tou.h
第三個問題:
當我在main.c中這樣
#define
unchar
unsigned
char
那麼當我在fun.c中還需要重新創建替換宏unchar嗎
可以不在創建而直接使用嗎?
答案是需重新創建,不能直接使用。但你可以把一些在多個文件中使用的宏、全局變數等統一定義到一個頭文件中,那這樣就可以避免多次定義了。

③ C語言 數據結構 文件及查找問題

關鍵字序列是{22,41,53,8,46,30,1,31,66},計算過程如下:

插入關鍵字22,索引(散列值)=3*22mod11=0,存入散列表:

下標012345678910
關鍵字22

插入關鍵字41,索引(散列值)=3*41mod11=2,存入散列表:

下標012345678910
關鍵字2241

插入關鍵字53,索引(散列值)=3*53mod11=5,存入散列表:

下標012345678910
關鍵字224153

插入關鍵字8,索引(散列值)=3*8mod11=2,有沖突,取索引2+1=3,沒有沖突,存入散列表:

下標012345678910
關鍵字2241853

插入關鍵字46,索引(散列值)=3*46mod11=6,存入散列表:

下標012345678910
關鍵字224185346

插入關鍵字30,索引(散列值)=3*30mod11=2,有沖突,取索引2+1=3,仍有沖突,
取索引3+1=4,沒有沖突,存入散列表:

下標012345678910
關鍵字22418305346

插入關鍵字1,索引(散列值)=3*1mod11=3,有沖突,依次取索引4,5,6,均有沖突,
取索引7,沒有沖突,存入散列表:

下標012345678910
關鍵字224183053461

插入關鍵字31,索引(散列值)=3*31mod11=5,有沖突,依次取索引6,7,均有沖突,
取索引8,沒有沖突,存入散列表:

下標012345678910
關鍵字22418305346131

插入關鍵字66,索引(散列值)=3*66mod11=0,有沖突,取索引0+1=1,沒有沖突,存入散列表:

下標012345678910
關鍵字2266418305346131

這就是最後得到的散列表.


//C語言測試程序
#include<stdio.h>
#include<stdlib.h>

#defineSUCCESS1
#defineUNSUCCESS0
#defineHASHSIZE11
#defineNULLKEY-1
typedefintStatus;

typedefstruct
{
int*elem;
intcount;
}HashTable;

intm=0;

StatusInitHashTable(HashTable*H)
{
inti;
m=HASHSIZE;
H->count=m;
H->elem=(int*)malloc(m*sizeof(int));
for(i=0;i<m;i++)
{
H->elem[i]=NULLKEY;
}
returnSUCCESS;
}

intHash(intkey)
{
return(3*key)%m;
}

voidInsertHash(HashTable*H,intkey)
{
intaddr;
intpos;
pos=Hash(key);
addr=pos;
while(H->elem[addr]!=NULLKEY)
{
////////
printf("索引=%d有沖突. ",addr);
////////
addr=(addr+1)%m;
if(addr==pos)
{
printf(" 散列表已滿! ");
exit(1);
}
}
H->elem[addr]=key;
}

StatusSearchHash(HashTableH,intkey,int*addr)
{
*addr=Hash(key);
while(H.elem[*addr]!=key)
{
*addr=(*addr+1)%m;
if(H.elem[*addr]==NULLKEY||*addr==Hash(key))
{
returnUNSUCCESS;
}
}
returnSUCCESS;
}

voidshowHashTable(HashTable*H)
{
inti;
for(i=0;i<H->count;i++)
{
printf("%4d",i);
}
printf(" ");
for(i=0;i<H->count;i++)
{
if(H->elem[i]==NULLKEY)
{
printf("%4c",0x20);
}
else
{
printf("%4d",H->elem[i]);
}
}
printf(" ");
}

intmain()
{
intkey[]={22,41,53,8,46,30,1,31,66};

intlen;
inti;
HashTableH;

InitHashTable(&H);

len=sizeof(key)/sizeof(key[0]);
for(i=0;i<len;i++)
{
printf("插入關鍵字%d,索引(Hash)=%d ",key[i],Hash(key[i]));
InsertHash(&H,key[i]);
showHashTable(&H);
}

return0;
}

④ 在win7下用dev編c程序在編譯時系統找不到指定的文件 這怎麼解決

1,一定要把Dev裝在系統盤(一般是C盤),經驗所得,多數編譯工具必須裝在系統盤,否則會出現各種「找不到文件」「XXX指令無效」等錯誤…。
2,安裝完整版的Dev,4.9.9.2的安裝包大約10M左右。
3,推薦新版本wxDev-C
7.4這是在Dev停止更新後,另外一個團隊接手Dev項目,改進的新版本,國外很火,國內幾乎無人知曉。

⑤ c語言程序如何找回main.c文件

C語文程序中必須有main()函數。

C的設計原則是把函數作為程序的構成模塊。main()函數稱之為主函數,一個C程序總是從main()函數開始執行的。

一、main()函數的形式
在最新的 C99 標准中,只有以下兩種定義方式是正確的:

int main( void ) /* 無參數形式 */
{
...
return 0;
}

int main( int argc, char *argv[] ) /* 帶參數形式 */

{
...
return 0;
}
int指明了main()函數的返回類型,函數名後面的圓括弧一般包含傳遞給函數的信息。void表示沒有給函數傳遞參數。關於帶參數的形式,我們等會討論。

瀏覽老版本的C代碼,將會發現程序常常以main()這種形式開始。C90標准允許這種形式,但是C99標准不允許。因此即使你當前的編譯器允許,也不要這么寫。

你還可能看到過另一種形式。
void main()

有些編譯器允許這種形式,但是還沒有任何標准考慮接受它。C++ 之父 Bjarne Stroustrup 在他的主頁上的 FAQ 中明確地表示:void main( ) 的定義從來就不存在於 C++ 或者 C 。所以,編譯器不必接受這種形式,並且很多編譯器也不允許這么寫。
堅持使用標準的意義在於:當你把程序從一個編譯器移到另一個編譯器時,照樣能正常運行。

二、main()函數的返回值
從前面我們知道main()函數的返回值類型是int型的,而程序最後的 return 0; 正與之遙相呼應,0就是main()函數的返回值。那麼這個0返回到那裡呢?返回給操作系統,表示程序正常退出。因為return語句通常寫在程序的最後,不管返回什麼值,只要到達這一步,說明程序已經運行完畢。而return的作用不僅在於返回一個值,還在於結束函數。

現在我們來做一個小試驗來觀察main()函數的返回值。編寫如下代碼並編譯運行:
//a.c
#include "stdio.h"
int main(void)
{
printf("I love you.");
return 0;
}
將這個文件保存為a.c,編譯運行後會生成一個a.exe文件。現在打開命令提示符,在命令行里運行剛才編譯好的可執行文件,然後輸入 echo %ERRORLEVEL% ,回車,就可以看到程序返回 一個0 。如果把 return 0; 改為 return 99; ,那麼很顯然,再次執行上述步驟以後你可以看到程序返回99。要是你這樣寫 return 99.99; 那還是返回99,因為99.99被傳給操作系統之前,被強制類型轉換成整數類型了。

現在,我們把a.c改回原來的代碼,然後再編寫另一個程序b.c:
//b.c

#include "stdio.h"
int main(void)
{
printf("I』m too.");
return 0;
}
編譯運行後打開命令提示符,在命令行里輸入a&&b 回車,這樣你就可以看到《人鬼情未了》裡面經典的愛情對白:
I love you.

I』m too.

&& 的含義是:如果 && 前面的程序正常退出,則繼續執行 && 後面的程序,否則不執行。所以,要是把a.c裡面的 return 0; 刪除或者改為 return 99; ,那麼你只能看到 I love you. 。也就是說,程序b.c就不執行了。現在,大家該明白 return 0; 的作用了吧。

三、main()函數的參數
C編譯器允許main()函數沒有參數,或者有兩個參數(有些實現允許更多的參數,但這只是對標準的擴展)。這兩個參數,一個是int類型,一個是字元串類型。第一個參數是命令行中的字元串數。按照慣例(但不是必須的),這個int參數被稱為argc(argument count)。大家或許現在才明白這個形參為什麼要取這么個奇怪的名字吧,呵呵!至於英文的意思,自己查字典吧。第二個參數是一個指向字元串的指針數組。命令行中的每個字元串被存儲到內存中,並且分配一個指針指向它。按照慣例,這個指針數組被稱為argv(argument value)。系統使用空格把各個字元串格開。一般情況下,把程序本身的名字賦值給argv[0],接著,把最後的第一個字元串賦給argv[1],等等。

現在我們來看一個例子:

//c.c

#include "stdio.h"
int main(int argc, char *argv[])
{
int count;
printf("The command line has %d arguments:
", argc - 1);
for(count = 1; count < argc; count++)
printf("%d: %s
", count, argv[count]);
return 0;
}
編譯運行,在命令行輸入c I love you 回車,下面是從命令行運行該程序的結果:

The command line has 3 arguments:

1:I

2:love

3:you

從本例可以看出,程序從命令行中接受到4個字元串(包括程序名),並將它們存放在字元串數組中,其對應關系:

argv[0] ------> c(程序名)

argv[1] ------> I

argv[2] ------> love

argv[3] ------> you

至於argc的值,也即是參數的個數,程序在運行時會自動統計,不必我們操心。

這個例子中,每個字元串都時一個單詞(字母),那既然是字元串,要把一句話當作參數賦給程序該怎麼辦?你可以在命令行里這樣輸入 c "I love you." "I』m too."。程序運行結果:

The command line has 2 arguments:

1:I love you.

2:I』m too.

其對應關系:

argv[0] ------> c(程序名)

argv[1] ------> I love you.

argv[2] ------> I』m too.

要注意的是,你在命令行的輸入都將作為字元串形式存儲於內存中。也就是說,如果你輸入一個數字,那麼要輸出這個數字,你應該用%s格式而非%d或者其他。

再來看一個例子:

//d.c
#include "stdio.h"
int main(int argc, char *argv[])
{
FILE *fp;
fp = fopen(argv[1], "w");
fputs("I love you.", fp);
fclose(fp);
return 0;
}

linux源代碼找到了函數定義的頭文件那麼相應的。c文件去哪裡找

頭文件並不一定要與.c文件一一對應。一個頭文件里的不同函數可以在不同.c文件中定義。
編譯器不是直接從.c文件中找的。編譯器先將.c文件編譯成.o文件,然後當某個.o文件中調用了某個函數而它自身又沒有這個函數時,它就會先把這個沒有出現的函數記下來,然後到後面鏈接的.o文件或者.a或者.so文件中找。如果仍然沒有找到,編譯器就會提示鏈接錯誤。

⑦ c編譯器可以找出c源程序中所有的語法錯誤和邏輯錯誤

錯。c編譯器可以找出c源程序中所有的語法錯誤,但並不找邏輯錯誤,也找不出邏輯錯誤。因為編譯器不可能知道編程者想要做什麼事。

⑧ 既然預編譯只是起一個聲明的作用,為什麼不在工程中每個c文件中包含所有的頭文件呢這樣不是很方便么

預編譯的時候會把包含的頭文件展開,即把頭文件裡面的內容展開在當前文件中,如果包含所有頭文件,第一會很占空間,因為有些頭文件裡面的變數(比如有很大的數組或者什麼的)在當前這個文件並沒有用到;其次很耗時間,因為要一個個去展開;第三,撇開時間和空間消耗不說,可能會存在不同頭文件中聲明或者定義了同名變數,這樣在編譯的時候就會報錯。但是你卻很難找到錯誤,因為頭文件裡面的東西你看不見,其次還可能引起一個重復包含的問題,比如頭文件A.h包含了B.h,你在當前.c文件中如果#include"A.h" 後又#include"B.h" 的時候就會報錯了,因為你重復包含了,當然重復包含可以通過#ifdef#endif機制解決。但是你不能保證每個頭文件中都做了這樣的操作。

⑨ 關於C語言編譯階段的一些問題

呵呵,找一本好書吧。我不能完全給你寫清楚,"sting.h"的拼寫已經有人說了。
簡單地說,要理解幾種文件:
A:源文件:例如匯編(asm)、c語言、cpp
B:目標文件
C:庫文件(lib)
D:可執行文件

A經過編譯器得到B,若干個B可以經過庫管理程序得到C,C也可以通過庫管理程序得到B(提取)
若干個B通過鏈接器可以得到D,但是比如strcmp是出現在C中的,但實際上鏈接器會到C中提取出strcmp所在的B,然後將這個B放入到你的D中。整過過程是一個求閉包的過程,具體參見《Linker and Loader》。

最後說說.h,其實.h本身並不是必要的,但是它可以減少人們的錯誤,減少重復的代碼。
比如printf,你完全可以不include<stdio.h>,你就自己寫上一行:
int printf(...);
然後你後面就是直接使用就好了,但是這樣會有很多缺陷,這些缺陷可能只有你深刻地理解C語言本身的缺陷後才能明白,不多說了。

閱讀全文

與c文件編譯時會查找所有c文件嗎相關的資料

熱點內容
右腦開發pdf 瀏覽:646
okuma系統如何手工編程 瀏覽:975
a4紙文件夾封面 瀏覽:965
命令查看網卡信息 瀏覽:302
僑豐真空壓縮袋價格 瀏覽:585
西方倫理學pdf 瀏覽:906
浪潮英信伺服器如何打開機箱 瀏覽:419
如何設置微信加密後別人知道嗎 瀏覽:913
貼吧知乎這類屬於什麼類型的app 瀏覽:763
華為雲網路系統伺服器 瀏覽:188
阿里雲教育雲伺服器 瀏覽:755
androidui設計尺寸 瀏覽:512
如何改變我的世界伺服器 瀏覽:250
程序員的不足之處 瀏覽:847
編譯的五大過程 瀏覽:989
三個火槍手pdf 瀏覽:276
opc伺服器怎麼區分 瀏覽:845
app重影是什麼意思 瀏覽:616
android更改鍵盤 瀏覽:722
壓縮機氣液分離器結構 瀏覽:654