extern usage of C language

本文详细介绍了C语言中的4种存储类型说明符:extern、static、register、auto,解释了它们的作用,并通过实例展示了extern变量声明的重要性及其实现方式。

C支持4种存储类型说明符:

       extern  static register auto

这些说明符告诉编译程序应该怎样保存有关变量。存储类型说明符放在其修饰的变量生明之前,其一般形式是:

    storage_specifiertype var_name;

*注* C89和C99均规定,typedef从造句方便上讲是存储类型说明符,而从通常的术语上讲不是存储类型说明符。

       在介绍extern之前,先对C链接作一简要说明。 C定义了三类链接:外部链接,内部链接无链接。

③函数和全局变量具有外部链接。这意味着它们对构成程序的所有文件都是可用的。

声明为static的文件域对象具有内部链接,仅在声明它们的文件中是已知的。

⑤局部变量没有链接,仅在它们自己的块中是已知的。

extern的主要用途是说明在程序的其它地方用外部链接声明的对象

为了说明其重要性,有必要了解一下声明和定义之间的区别:声明表述对象的名称和类型,定义则导致为对象分配存储空间。同一个对象可以有许多声明,但只能有一个定义。在很多情况下变量的声明也是定义。但是,通过在变量名之前加上extern说明符,

可以声明变量而不必定义它。这样,当需要引用在程序的其它地方定义的变量时,则只

需要用extern声明该变量。

下面是使用extern的一个实例。注意全局变量first和last是在main之后定义的。

#include<stdio.h>

int main(void)

{

       Extern int first,last;/*use global vars*/

       printf(“%d %d”,first,last);

       return 0;

}

/*global definitonof first and last*/

该程序的输出为 10 20 ,因为printf语句使用的全局变量first和last被初始化为这两个值。由extern声明告诉编译程序,first和last是在其它地方声明的(此处是在同一文件

的稍后),所以,即使first和last在它们的定义之前使用。也能无错地对该程序进行编译。

前面的程序所示的extern变量声明之所以是必要的,仅仅因为在main中使用first和last

之前尚无定义它们。(关于为什么编译器要求变量在使用之前必须先定义,请看编译原理)。倘若在main之前定义了这两个变量,则无需extern语句。

切记,如果编译程序发现了没有在当前块中声明的变量,则检验该变量是否与外部

块中的任何变量匹配(如果有很多嵌套的外部块,则从内向外层层匹配,直到最外层的外部块)。若果不匹配,编译程序便检查全局变量;如果找到了匹配的变量,编译程序

便假定它就是所要引用的变量。当需要使用文件中稍后定义的变量时,需要extern说明符。

如上所述,extern允许不加定义地声明变量。但是,如果同时将变量初始化,那么extern

声明将变成定义。明白这一点很重要。

extern的重要用途与多文件程序有关。C允许程序分散在两个或多个文件之中。分别编译,然后再链接到一起。在这种情况下,必须以某种方式,将程序所需要的全局变量通知给所有不在其定义的文件之外的其它文件。最佳方式(也是最便捷的方式)就是:

在一个文件中定义所有的全局变量,而在另一个文件中使用extern声明前面定义的所有的变量,

       文件1                   文件2                              文件3

   int x,y;                    externint x,y;                      #include<文件2>

   char ch;                  externchar ch;                    int main(void)

                                                                             {

                                                                                           …

                                                                                           x=5;

                                                                                           y= 10;

                                                                                           ch=’A’;

                                                                                           …

                                                                             }

在文件3中,存储类型说明符extern通知编译程序,告知其后变量的类型和名字已在程序的别的文件中定义。换言之,extern使编译程序了解这些全局变量的类型和名字,同时又不再为之分配内存。当链接程序链接各模块时,自动理解文件中对外部变量的引用。

       最后说明一点⑩:在实际开发中,多文件程序和extern声明通常包含在头部中,头部直接由每个源代码文件包含。如上程序所示。

       extern也可用于函数声明,但这样做是多余的。不过为了一目了然,实际开发中还是象变量一样用extern声明函数。


<think> Hmm, the user is asking about the usage of the 'public' keyword in C language. Let me analyze this carefully. First, I recall that C is a procedural language without built-in OOP features like access modifiers. The references mention that 'public' appears in C++ and Java as an access specifier, but not in standard C. Reference [1] and [3] specifically discuss C++'s public/protected/private, while reference [2] compares Java's public to C. The user might be confusing C with C++ here. I should clarify that C doesn't have classes or access modifiers. But perhaps they're referring to struct visibility? In C, all struct members are public by default since there's no encapsulation mechanism. Wait, reference [4] lists C keywords and 'public' isn't among them - that's strong evidence. The user could be working with C++ while thinking it's C, or maybe they encountered some non-standard extension. I should explain the fundamental difference: C uses header files for "public" declarations, while implementation details go in .c files. The concept exists, but not as a keyword. Better provide concrete examples: how global functions are declared in headers (public) versus static functions (private). Also mention struct member accessibility since that's the closest parallel to OOP public members. The user seems to have basic confusion between C and C++ concepts. My response should correct this gently while giving practical C equivalents. No need to mention Java comparisons unless they ask. </think>在C语言中,**并不存在`public`关键字**。`public`是面向对象编程语言(如C++、Java)中用于访问控制的修饰符,而C语言作为过程式编程语言,没有内置的类(class)和访问控制机制。以下是详细说明: ### 1. **C语言中的"公开"概念实现方式** - **结构体(struct)成员默认公开** 在C语言中,结构体的所有成员都是直接可访问的,相当于隐式"公开": ```c struct Point { int x; // 默认可被外部直接访问 int y; }; int main() { struct Point p1; p1.x = 10; // 直接访问成员 p1.y = 20; } ``` - **函数和变量的可见性** - 全局函数和变量:通过头文件(`.h`)声明实现跨文件访问 ```c // utils.h extern void public_func(); // 声明为可公开访问 // utils.c void public_func() { ... } // 实现 ``` - 限制访问:使用`static`关键字将作用域限定在当前文件 ```c // file1.c static void private_func() { ... } // 仅当前文件可访问 ``` ### 2. **对比C++中的`public`** C++通过类(class)和访问修饰符实现封装: ```cpp class MyClass { public: // 公有成员,外部可访问 int public_var; void public_method() {} private: // 私有成员,仅类内部可访问 int private_var; }; ``` > 引用[1][3]明确指出:**C语言没有类(class)和访问修饰符(public/protected/private)的概念**,这些是C++的特性[^1][^3]。 ### 3. **常见误解澄清** - **C语言 vs C++关键字** 参考引用[4]的C语言关键字列表:**`public`不在C语言的关键字列表中**,而是属于C++[^4]。 - **Java的`public`与C语言** 引用[2]提到:Java的`public`修饰符在C语言中无直接等价物,因二者设计范式不同[^2]。 ### 4. **C语言中实现封装的替代方案** - **不透明指针(Opaque Pointer)** 隐藏结构体细节,仅通过接口访问: ```c // mylib.h typedef struct HiddenStruct HiddenStruct; HiddenStruct* create_obj(); void operate_on_obj(HiddenStruct* obj); // mylib.c struct HiddenStruct { // 实现细节对调用者隐藏 int internal_data; }; ``` ### 总结表格 | 特性 | C语言 | C++ | |---------------------|-------------------------------|------------------------------| | 访问控制关键字 | 不支持 | 支持(`public/protected/private`) | | 默认成员可见性 | 结构体成员全部公开 | 类成员默认`private` | | 封装实现方式 | 通过头文件声明和`static`限定 | 通过访问修饰符 | > 若您需要控制访问权限,建议: > 1. 使用头文件声明公有函数/变量 > 2. 用`static`限制文件内私有内容 > 3. 结合不透明指针隐藏实现细节
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值