如何声明只存在于一个函数中的全局变量?

时间:2011-08-11 12:35:39

标签: c global-variables

我需要声明一个全局变量,只有在调用某个函数时才可用。 如果未调用该函数,则该变量不可用。

 void function()
 {
   // if this function is called then declare int a=10; 
   // as global so other function can use this 
 }

我怎样才能在c中做这样的事情?

6 个答案:

答案 0 :(得分:4)

C不能像那样工作 - 全局变量在加载时分配,并且在程序的整个持续时间内存在,与运行时行为无关。如果你真的必须知道变量是否已经“设置”,你可以包含一个单独的标志:

int global_a;
int global_a_has_been_set = 0;

void f()
{
  global_a = 10;
  global_a_has_been_set = 1;
}

void elsewhere()
{
  if (global_a_has_been_set != 0) { /* ... */ }
}

如果您知道您的变量只能是非负数,那么您也可以使用像-1这样的特殊标记值来表示该变量尚未“设置”。

最有可能的是你应该重新设计你的设计,以便你已经通过其他方式知道你是否需要变量。

答案 1 :(得分:3)

您可以在函数内定义static变量,然后它只在该函数中可用(并在多次调用之间保持其值):

int increment() {
  static int x = 0; // Initialize with 0
  x++;
  return x;
}

void main() {
  printf("%d\n", increment());
  printf("%d\n", increment());
  printf("%d\n", increment());

  // (unfortunately) x is not available here...
}

Returns:
1
2
3

每次调用increment()函数时,它都会返回一个更高的数字。

不可能在其范围之外使用变量。因此,您可以在“全局范围”中定义变量(如Kerrek SB所示)或函数(或任何其他范围)中的静态变量(如上所示)。如果这些可能性中的任何一种不适用于您的情况,我恐怕您应该(大幅度)修改您的应用程序的结构......

答案 2 :(得分:2)

C不是动态语言 - 所有声明的变量始终存在(受范围规则约束)。

您无法测试变量是否已声明,这是编译器作业,如果您尝试使用不在范围内的变量,它会给您一个错误。

全局变量在首次加载程序时会自动为它们分配空间(在“数据”段中)。

因此,您只能测试变量是否已从其原始指定值更改。

答案 3 :(得分:1)

没有办法可以将全局变量的范围限制为文件中的一个函数,它可用于文件中的所有函数。但是,您可以通过使用静态关键字将全局变量的范围限制为仅文件全局变量名。

   file1.c //1st file                     file2.h //2nd file

   #include<file2.h>                     
   main()                                static int a;
   {
   fun();                                 fun()
   }                                      {
                                           printf("%d",a);
                                          }

在示例中,您有两个文件file1.c和file2.h,Now变量a仅可用于第一个文件中的fun()函数。

答案 4 :(得分:0)

将global声明为static,并且不要初始化它。 一旦函数被调用,就在函数

中初始化它

static int a;

void main()
{
  // Some code here
}

void function()
{
  a=10; 
  // Some code here as well

}

答案 5 :(得分:0)

建议尽可能避免使用全局变量。 在您的特定情况下,您可以做的只是:

function(int* toModify)
{
    *toModify = 10;
    // do sth
}

现在您的其他功能可以使用修改后的值。

但是,如果您热衷于使用全局变量,则必须使用两个全局变量

int gIsFuncCalled = 0;
int gToModify = 0;

void function() 
{ 
    gIsFuncCalled = 1;
    gToModify = 10;
}

现在,您可以使用gToModify

有条件地使用gIsFuncCalled