在C书中,它说:
至少内部名称的前31个字符是重要的.对于函数名和外部变量,该数字可能小于31,因为外部名称可能由语言无法控制的汇编程序和加载程序使用.对于外部名称,该标准仅保证6个字符和单个案例的唯一性.保留if,else,int,float等关键字:不能将它们用作变量名.它们必须是小写的.
有人可以解释什么是"内部名称","外部名称","外部变量"?如果你能做一个例子会更好.
O. *_*nes 29
我说,抚摸着我的白胡子,用圣人和浮夸的声音说话:
在过去,当FORTRAN和COBOL统治计算世界时,新兴语言C必须适应现有的工具链.这些工具链包括链接编辑器(a/k/a连接器,a/k/a加载器)和仅处理短6个字符符号(变量和函数)的汇编器.
这些工具链的C编译器在写出要由链接编辑器使用的目标文件时必须假装变量和函数名称很短.这是坏消息.好消息是C程序中有很多符号不需要显示在目标文件中.
例如,函数的名称...例如"main"和"sqrt"......需要显示在对象模块中,因此来自其他对象模块的代码可以使用它们."extern"样式全局变量的名称也是如此.这些是外部名称.
但是C程序中的所有其他名称,例如函数范围中的变量名称,结构成员的名称等等,都不必将其放入对象模块中.这些被称为"内部名称".
因此,例如,您可以在函数中包含这些C变量
int myFavoriteItem;
int myFavoriteThing;
Run Code Online (Sandbox Code Playgroud)
那没关系.但你可以将它们声明为外部变量,如下所示:
extern int myFavoriteItem;
extern int myFavoriteThing;
Run Code Online (Sandbox Code Playgroud)
有些系统会将这些名称写入目标文件,就像它们长六个字母一样(因为目标文件不知道如何处理更长的名称).然后,他们将查看目标文件,就好像它们已经被声明为这样.
extern int myFavo;
extern int myFavo;
Run Code Online (Sandbox Code Playgroud)
那些将是重复声明.C编译器需要捕获此类事件并抛出错误,而不是将重复声明写入目标文件.这对程序员来说是一个很大的帮助:生成的目标文件中的重复声明实际上隐藏了链接编辑器错误消息.
您引用的段落指定编译器必须至少识别内部名称的31个字符和外部名称的6个字符.现代编译器和工具链不再具有不同的名称长度限制.
小智 5
外部名称:
“外部”名称是其他编译单元可见的名称,例如使用“extern”关键字声明的非静态函数和变量。这些名称必须暴露给链接器和加载器。在过去,一些链接器和加载器只能处理非常短的名称。
内部名称:
“内部”名称是那些在正在编译的模块外部不可见的名称——基本上是具有“静态”范围的任何名称,或者是函数本地的任何名称。C 编译器必须处理这些名称,但不能处理其他任何东西
“内部名称”是函数内标识符的名称(实际上是局部变量名称)。
“外部名称”将是其他标识符的名称,包括函数的名称以及在全局范围内声明或使用存储类 extern 声明的任何标识符。
基本上,任何需要“外部可见”的东西都只能保证有 6 个(不区分大小写)唯一字符,这是极其有限的。
实际上,这不再是问题。C99 增加了这些限制,并且大多数现代编译器消除或显着增加了这些限制。例如,在编译 C 时,Visual C++ 允许所有标识符(内部或外部)使用 247 个字符来保持唯一性。