c語言變量和函數聲明的修飾符static,extern,#define,const

寫的比較亂,因爲是剛開始學C,沒有一個系統的概念,都是想到什麼,測試到什麼就添加什麼,僅供參考
而且可能會有錯誤的地方,如果有請指出

static:靜態

作用域以及聲明方法:

1、在函數中聲明則僅作用於該函數

void fun(){
    static int i;
}

2、在函數外聲明則作用與從聲明開始到文件末尾

static int i;
void fun(){
}

extern:引用(其他c文件)

作用域以及聲明方法:

1、可以聲明變量或函數,並且不必變量初始化或函數定義實現,即可使用,因爲引用變量或函數聲明時,會同時引用被引用文件內的初始化語句
2、被引用的變量或函數不能被static修飾
3、相當與引用(複製?)其他文件中的聲明和定義/初始化語句到本文件的聲明位置
4、在本文件使用extern聲明變量或函數時,變量或函數名以及函數返回類型和函數參數列表應與要引用的變量或方法一致(經測試,變量不一致時好像類似聲明的指針類型變量,方法暫未測試)
5、在函數內聲明則類似局部變量,作用域僅在本函數,在函數外,作用域從聲明處到文件末尾
6、如果你是學習C語言的新手,而且暫時只是在使用文本編輯器在寫C程序,那麼需要注意,在編譯有extern語句的C文件時,應該與被引用的文件一起編譯(筆者表示在開始時一直在單獨編譯一個文件所以一直編譯報錯)
比如下面例子的a1.c和b.c,或者a2.c和b.c,編譯的時候應該這樣:

gcc a1.c b.c
/* 或者 */
gcc a2.c b.c
/* 這樣編譯器才能找到被extern的變量或函數 */

不要將a1.c和a2.c以及b.c這三個一起編譯,應該將a1.c和b.c一起編譯,或者a2.c和b.c一起編譯,這是兩個例子

/* a1.c */
/* 在文件開始聲明(將類似全局變量) */
#include <stdio.h>
extern int test1;
extern void testFun1();
extern int testFun2(int temp);
int main(){
    int temp=20;
    testFun1();
    testFun2(temp);
    return 0;
}
/*####################*/
/* a2.c */
/* 在函數內部聲明(將類似局部變量) */
#include <stdio.h>
void myFun1();
int main(){
    myFun1();
    return 0;
}
void myFun1(){
    extern int test1;
    extern void testFun1();
    extern int testFun2(int temp);
    int temp=30;
    testFun1();
    testFun2(temp);
}
/*####################*/
/* b.c */
#include <stdio.h>
int test1=10;
void testFun1(){
    printf("test1 in testFun1():%d\n",test1);
}
int testFun2(int temp){
    test1=temp;
    printf("test1 in testFun2():%d\n",test1);
    return 0;
}

“#define”:常量

作用域以及聲明方法:

1、在函數內聲明則作用域僅在本函數,在函數外,作用域從聲明處到文件末尾,不過大多在文件頭,include語句下聲明
2、定義後無法再次對其賦值
3、聲明時末尾不能使用分號結束,不能聲明數據類型(也就是沒有數據類型),不能有等號

#include <stdio.h>
#define a 1
int main(){
    printf("a:%d\n",a);
    return 0;
}
/* 另一個例子 */
#include <stdio.h>
void test1();
int a;
int main(){
    test1();    
    printf("a:%d\n",a);
    return 0;
}
void test1(){
    #define a 1
    printf("a:%d\n",a);
}

const:常量

作用域以及聲明方法:

1、在函數內聲明則作用域僅在本函數,在函數外,作用域從聲明處到文件末尾,不過大多在文件頭,include語句下聲明
2、定義後無法再次對其賦值
3、需要指定數據類型,並使用等號爲其賦值,否則,則只能有默認值(因爲在程序其他位置無法再次對其賦值)

#include <stdio.h>
const int a=10;
int main(){
    printf("a:%d\n",a);
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章