我是Linux新手。我遇到了这段代码来打印环境变量。这让我很困惑。这段代码如何打印环境变量?
#include <stdio.h>
extern char **environ;
int main()
{
char **var;
for(var=environ; *var!=NULL;++var)
printf("%s\n",*var);
return 0;
}
这里extern
是什么?
答案 0 :(得分:1)
如果您不知道extern
的含义,请找一本书来学习C语言。它只是意味着'在其他地方定义,但在这里使用'。
environ
全局变量最近在<unistd.h>
中声明(尽管很长一段时间没有声明它的标题)。它类似于程序的argv
数组,一个字符指针数组,每个字符指针指向name=value
格式的环境变量。该列表由空指针终止,如argv
。但是,环境并不重要。
for (var = environ; *var != NULL; ++var)
printf("%s\n", *var);
因此,在第一次迭代中,var
指向第一个环境变量;然后它会递增到下一个,直到值*var
(a char *
)为NULL,表示列表的结尾。
该循环也可以写成:
char **var = environ;
while (*var != 0)
puts(*var++);
答案 1 :(得分:1)
来自维基百科http://en.wikipedia.org/wiki/External_variable:
定义,声明和extern关键字
要理解外部变量与extern关键字的关系,有必要了解定义和声明变量之间的区别。定义变量时,编译器为该变量分配内存,并可能还将其内容初始化为某个值。声明变量时,编译器要求在其他地方定义变量。声明通知编译器存在由该名称和类型的变量,但编译器不需要为它分配内存,因为它是在其他地方分配的。
extern关键字表示&#34;声明而不定义&#34;。换句话说,它是一种显式声明变量或强制声明而无需定义的方法。还可以明确定义变量,即强制定义。这是通过为变量分配初始化值来完成的。如果extern关键字和初始化值都不存在,则该语句可以是声明或定义。由编译器来分析程序的模块并决定。
必须在程序的一个模块中定义一次变量。如果没有定义或多于一个定义,则可能在链接阶段产生错误。变量可以被声明多次,只要声明彼此一致并且与定义一致(头文件大大方便了)。它可以在许多模块中声明,包括定义它的模块,甚至在同一模块中多次。但是在模块中多次声明它通常是没有意义的。
外部变量也可以在函数内声明。在这种情况下,必须使用extern关键字,否则编译器会将其视为局部变量的定义,该变量具有不同的范围,生命周期和初始值。此声明仅在函数内部可见,而不是在整个函数模块中可见。
应用于函数原型的extern关键字绝对没有任何内容(应用于函数定义的extern关键字当然是非语义的)。函数原型始终是一个声明,而不是一个定义。此外,在ANSI C中,函数始终是外部函数,但某些编译器扩展和较新的C标准允许在函数内定义函数。
外部变量必须在任何外部变量中定义一次 功能;这为它预留了存储空间。变量也必须是 在每个想要访问它的函数中声明;这说明了 变量的类型。声明可能是一个明确的外部 声明或可能隐含在上下文中。 ......你应该注意我们 我们在推荐时会仔细使用单词定义和声明 本节中的外部变量。定义指的是地方 创建变量或分配存储的位置;声明是指 到陈述变量性质但没有存储的地方 分配
- C编程语言
范围,生命周期和静态关键字
程序的所有模块中的所有函数都可以访问外部变量。这是一个全球变量。对于能够使用变量的函数,外部变量的声明或定义必须位于源代码中的函数定义之前。或者必须在函数内部使用关键字extern声明变量。
静态关键字(static和extern是互斥的),应用于外部变量的定义,稍微改变一下:该变量只能由定义它的同一模块中的函数访问。但是,同一模块中的函数可以将变量的引用(指针)传递给另一个模块中的另一个函数。在这种情况下,即使函数在另一个模块中,它也可以读取和修改变量的内容 - 它不能通过名称引用它。
也可以在局部变量的定义上使用static关键字。如果没有static关键字,则在调用函数时自动分配变量,并在函数退出时释放该变量(因此名称为&#34;自动变量&#34;)。函数调用之间不保留其值。使用static关键字,变量在程序启动时分配,在程序结束时释放。函数调用之间的值不会丢失。该变量仍然是本地的,因为它只能通过名称在定义它的函数内访问。但是它的引用(指针)可以传递给另一个函数,允许它读取和修改变量的内容(同样不用名称引用它)。
程序启动时会分配和初始化外部变量,并且仅在程序结束时释放内存。他们的一生与计划相同。
如果未明确进行初始化,则将外部(静态或非静态)和本地静态变量初始化为零。本地自动变量未初始化,即包含&#34;垃圾&#34;值。
应用于函数定义的static关键字阻止函数从其模块外部通过名称调用(仍然可以将函数指针传递出模块并使用它来调用函数)。
示例(C编程语言)
文件1:
int GlobalVariable; // implicit definition
void SomeFunction(); // function prototype (declaration)
int main() {
GlobalVariable = 1;
SomeFunction();
return 0;
}
文件2:
extern int GlobalVariable; // explicit declaration
void SomeFunction() { // function header (definition)
++GlobalVariable;
}
在此示例中,变量GlobalVariable在文件1中定义。为了在文件2中使用相同的变量,必须声明它。无论文件数量如何,全局变量只定义一次,但必须在包含定义的文件之外的任何文件中声明。
如果程序在多个源文件中,并且变量在file1中定义并在file2和file3中使用,则在file2和file3中需要extern声明来连接变量的出现。通常的做法是在一个单独的文件中收集变量和函数的extern声明,这个文件在历史上称为标题,由#include包含在每个源文件的前面。后缀.h对于标题名称是常规的。
答案 2 :(得分:0)
Extern定义了一个可以从其他文件中使用的变量或函数......我强烈建议阅读互联网上有关C编程的一些文章:https://www.google.ca/search?client=opera&rls=en&q=learn+c&sourceid=opera&ie=utf-8&oe=utf-8&channel=suggest
答案 3 :(得分:0)
extern char ** environ;
变量environ来自您将链接的库。
该变量保存了当前
的系统环境变量linux系统。这就是你可以这样做的原因。