extern用法總結!

來源:互聯網
上載者:User

標籤:style   使用   os   strong   檔案   io   for   art   

 

extern

   在源檔案A裡定義的函數,在其他源檔案中是看不見的(即不能訪問)。為了在源檔案B裡能調用這個函數,應該在B的頭部加上一個外部聲明:

   
  extern   函數原型;   


  這樣,在源檔案B裡也能夠調用那個函數了。  
  注意這裡的用詞差別:在A裡是定義,在B裡是聲明。一個函數僅僅能(也必須)在一個源檔案中被定義,可是能夠在其他多個源檔案中被聲明。定義引起儲存分配,是真正產生那個實體。而聲明並不引起儲存分配。打一個粗俗的例如:在源檔案B裡聲明後,好比在B裡開了一扇窗,讓它能夠看到A裡的那個函數。

 

#i nclude "stdafx.h"


  1.extern用在變數聲明中經常有這樣一個作用,你在*.c檔案裡聲明了一個全域的變數,這個全域的變數假設要被引用,就放在*.h中並用extern來聲明。
  2.假設函數的聲明中帶有keywordextern,僅僅是暗示這個函數可能在別的源檔案裡定義,沒有其它作用。即下述兩個函式宣告沒有差別:
  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;

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.