extern
在源文件A里定義的函數,在其它源文件里是看不見的(即不能訪問)。為了在源文件B里能調用這個函數,應該在B的頭部加上一個外部聲明:
extern 函數原型;
這樣,在源文件B里也可以調用那個函數了。
注意這里的用詞區別:在A里是定義,在B里是聲明。一個函數只能(也必須)在一個源文件里被定義,但是可以在其它多個源文件里被聲明。定義引起存儲分配,是真正產生那個實體。而聲明並不引起存儲分配。打一個粗俗的比方:在源文件B里聲明后,好比在B里開了一扇窗,讓它可以看到A里的那個函數。
#i nclude "stdafx.h"
1.extern用在變量聲明中常常有這樣一個作用,你在*.c文件中聲明了一個全局的變量,這個全局的變量如果要被引用,就放在*.h中並用extern來聲明。
2.如果函數的聲明中帶有關鍵字extern,僅僅是暗示這個函數可能在別的源文件里定義,沒有其它作用。即下述兩個函數聲明沒有區別:
extern int f(); 和int f();
================================
如果定義函數的c/cpp文件在對應的頭文件中聲明了定義的函數,那么在其他c/cpp文件中要使用這些函數,只需要包含這個頭文件即可。
如果你不想包含頭文件,那么在c/cpp中聲明該函數。一般來說,聲明定義在本文件的函數不用“extern”,聲明定義在其他文件中的函數用“extern”,這樣在本文件中調用別的文件定義的函數就不用包含頭文件
include “*.h”來聲明函數,聲明后直接使用即可。
================================
舉個例子:
//extern.cpp內容如下:
// extern.cpp : Defines the entry point for the console application.
//
#i nclude "stdafx.h"
extern print(char *p);
int main(int argc, char* argv[])
{
char *p="hello world!";
print(p);
return 0;
}
//print.cpp內容如下
#i nclude "stdafx.h"
#i nclude "stdio.h"
print(char *s)
{
printf("The string is %s/n",s);
}
結果程序可以正常運行,輸出結果。如果把“extern”去掉,程序依然可以正常運行。
由此可見,“extern”在函數聲明中可有可無,只是用來標志該函數在本文件中定義,還是在別的文件中定義。只要你函數在使用之前聲明了,那么就可以不用包含頭文件了。
VC++6.0中常出現的"unexpected end of file while looking for precompiled header directive"的問題?
如何解決:"fatal error C1010:VC++6.0中常出現的"unexpected end of file while looking for precompiled header directive"的問題?
我想大家在VC6.0中經常回遇到這樣的問題,如何解決呢?
1、看看是否缺少“;”,“}”
如:類,結構體后面的分號
隱藏得深的是宏、.h文件的問題就要費點心思了
2、一定是你在類的部分定義被刪除了,M$在每個類中定義一些特殊的常量,是成對的,如下:
.h:
#if !defined(AFX_CHILDFRM_H__54CA89DD_BA94_11D4_94D7_0010B503C2EA__INCLUDED_)
#define AFX_CHILDFRM_H__54CA89DD_BA94_11D4_94D7_0010B503C2EA__INCLUDED_
.......
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_MAINFRM_H__54CA89DB_BA94_11D4_94D7_0010B503C2EA__INCLUDED_)
你可以新建一個類,然后把這些拷貝過去或補上就可以了。
3、在頭部加入 #i nclude "stdafx.h"
4、在CPP文件第一行加上#i nclude "stdafx.h"。
或者Rebuild All.
5、
(1). [Project] - [Settings] - [C/C++] - [Category]
(2). 選擇 [Precomplied Headers]
(3). 單選 [Not Using Precomplied Headers]
(4). [OK]
如果以上不能解決問題,那么就請看以下內容.引起這樣的錯誤,有可能你只是增加了一個.H和.CPP的文件.這時你就要按上面所說.
名含"stdafx.h"即可.如果還要在多個文件里同時使用結構類型,你就要繼續向下看了.一定會有不少收獲的.
類型的定義和類型變量的定義不同,
類型定義只是描述一個類型,
是給編譯器看的,
不會產生可執行代碼。
變量定義是指在執行文件中真實得存在這么一塊內容。
因為每個.c里都要寫清楚類型定義很麻煩,
所以一般都把類型定義寫在.h里
,而在.c里采用簡單的寫法,如struct A a;
這樣定義變量,
不需把整個類型的描述再寫一遍。
------------------------------------------------------------------------
所以,struct類型定義放到 XX.h里面,
XX.cpp 里加struct str st_r;
XXXXX.cpp加上#i nclude "XX.h"
然后直接使用extern struct str st_r;
