本文目錄一覽:
- 1、C語言 在外部定義結構類型?
- 2、C語言如何定義外部結構體?
- 3、有關C語言的內部函數和外部函數的定義說明
- 4、c語言 靜態變數和寄存器變數可以定義外部變數嗎?定義有什麼條件
- 5、C語言中如何申明外部定義的結構體數據。
- 6、C語言關於外部變數聲明與定義
C語言 在外部定義結構類型?
這樣做是不對的
應該這樣:
文件str.h
struct STR
{
int a;
int b;
}; //注意這裡不要聲明變數
文件str.cpp
#include “str.h”
struct STR str; //在這裡聲明
文件main.cpp
#include stdio.h
#include “str.h”
extern struct STR str; //這樣就可以引用外部變數了
int main(void)
{
str.a = 8;
return 0;
}
總結:
1、#include只引用頭文件,不要引用程序文件
2、#include只聲明類型,不要聲明變數,因為多次引用會對同一變數多次分配內存,是錯誤的重複定義;
3、變數定義必須放在程序體文件,這樣在其他程序體只要聲明extern就可以引用了
C語言如何定義外部結構體?
把這個結構體放在一個.h文件中。其他c文件引用這個.h文件。
type.h
#ifndef type_h
#define type_h
struct ABC
{unsigned a;
unsigned b;
}abc;
#endif
qita.c
#include “type.h”
int main(){
abc.a=6;
}
有關C語言的內部函數和外部函數的定義說明
有兩種理解.(1)庫函數是C語言的內部函數或自帶函數,外部函數即程序員自定函數.
(2)凡加寫了extern 的函數是外部函數.
第一種理解好懂:
C語言的內部函數指的是C語言自帶的函數,無論是動態鏈接的或靜態鏈接的. 這些函數通過C語言的頭文件定義了.
例如, sin(),cos()等數學函數,在math.h中定義了,輸入輸出函數 printf(),fgetc()在stdio.h中定義了,時間函數表time(),ctime()等在time.h中定義了.還有許多其他內部函數.編程時,只要用#include 庫名.h寫在編程頭部,程序中就可調用.
自定義函數,就是用戶自己寫的函數.
第二種凡加寫了extern 的函數是外部函數:
自定義函數可以與程序的main()寫在同一個文件中,也可以寫在另一個文件中,這時你可能還另寫自己的頭文件或者寫extern….,告訴編譯器,main中用到的某某函數是”外部函數”.
例如,main()在a.c中,自定義函數my_func()在a2.c中
a.c內容:
#include stdio.h
extern float my_func(float a);
main()
{
printf(“result=%f\n”,my_func(2.0));
}
a2.c 內容:
float my_func(float a)
{
return a;
}
編譯:
cl -c a.c [得到a.obj]
cl -c a2.c [得到a2.obj]
cl a.obj a2.obj [鏈接成a.exe]
運行:
a.exe
得
result=2.000000
extern float my_func() 是外部說明,告訴編譯,main()里的my_func是外部函數,要通過鏈接(.obj)得到.
如果把my_func寫在a.c里:
#include stdio.h
float my_func(float a){
retun a;
}
main()
{
printf(“result=%f\n”,my_func(2.0));
}
my_func() 就不是外部函數.
編譯:
cl a.c [得a.exe]
運行:
a.exe
得
result=2.000000
c語言 靜態變數和寄存器變數可以定義外部變數嗎?定義有什麼條件
static修飾函數:
在修飾非成員函數時表示該函數不是全局函數,而僅供本文件使用;
在修飾成員函數時,表示該函數只能調用類的靜態成員變數並且該方法可以不必經由實例化的類對象就能夠應用;
static修飾變數:
修飾全局變數時,該變數只能供本文件內部使用;
修飾成員變數時,該變數成為類變數,存儲在靜態存儲區中,不經過類實例就可以訪問該變數;
修飾局部變數時,該變數在函數第一次被調用時初始化,並將其存放到靜態存儲區,函數退出後變數值保持不變,下一次進入函數時將跳過對它的初始化,它的生命周期直到程序退出。
最後,要說明的是,static變數在全局中只有一份,不會有多份拷貝。
extern用於聲明變數時,如果不指出變數的類型,則默認為int,如果不是int的,必須顯示指出變數的類型,否則出錯。
extern實際上只對變數有用,對函數而言,只是個幌子(能夠更加清晰明了的讓我們知道也讓編譯器知道該函數可以用於「外交」),沒有實質性的作用,以後記住了,看到extern和函數扯上關係,你理都不用理,直接把它拿掉就OK了。但是它還是有那麼一點用的,既然「存在的就是合理的」,那麼它必然有點用啦,利用它可以在程序中取代include 「*.h」來聲明函數,在一些複雜的項目中,我比較習慣在所有的函數聲明前添加extern修飾。
本質上,我認為,函數可以將聲明和定義分開,而變數就不行了,因此只能藉助於extern來實現這一點,要是變數也能將聲明和定義分開,或許extern根本就不該活在這個世上。
extern可以被寫在變數/函數的聲明/定義處,但是標準的用法應該只是將其寫在聲明處,寫在定義處只不過為了再次強調或直觀明了而已。
C語言中如何申明外部定義的結構體數據。
方法一:文件包含
//a.c
#includestdio.h
#includestdlib.h
#include”c.c”
main()
{
int b;
g-v=1;
b=a(1);
printf(“%d”,g-v);
}
//c.c
#includestdio.h
int a(int x)
{
printf(“%d”,x);
return 0;
}
方法2;頭文件
//a.c
#includestdio.h
#includestdlib.h
#include “b.h”
main()
{
int b;
g-v=1;
b=a(1);
printf(“%d”,g-v);
}
//b.h定義一個頭文件
int a(int x);
struct gg;
//c.c
#includestdio.h
int a(int x)
{
printf(“%d”,x);
return 0;
}
struct gg
{
int v;
}*g;
方法3:外部變數
//c.c
#includestdio.h
extern b
typedef struct gg
{
int v;
}b,*g;
C語言關於外部變數聲明與定義
不要在共同include的頭文件里定義。
把變數定義在其中一個C文件又或者只有它才用的頭文件里。例如
int share;
然後在其他要用的C文件中使用
extern int share;
來聲明。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/180260.html