extern and global in c
Asked Answered
D

5

9

Can anyone please tell me is there any special requirement to use either EXTERN or GLOBAL variables in a C program? I do not see any difference in a program like below, if I change from gloabl to extern.

#include <stdio.h>
#include <stdlib.h>
int myGlobalvar = 10;

int main(int argc, char *argv[])
{
  int myFunc(int);
  int i;
  i = 12;
  myGlobalvar = 100;
  printf("Value of myGlobalvar is %d ,  i = %d\n", myGlobalvar, i);
  i = myFunc(10);
  printf("Value of passed value : %d\n",i);
  printf("again Value of myGlobalvar is %d ,  i = %d\n", myGlobalvar, i);
  system("PAUSE");  
  return 0;
}
int myFunc(int i)
{
    i = 20 + 1000;
//extern int myGlobalvar;
myGlobalvar = 20000;
//    printf("Value of passed value : %d",i);
return i;
}

If uncomment extern int myGlobalvar, the value does not change.

Is there any correct difference between both?

Can anyone please correct me?

Doralia answered 16/4, 2010 at 11:36 Comment(1)
There is no behavioural difference, except for possibly on the visibility of the variable name.Melvinmelvina
C
33

The keyword extern means "the storage for this variable is allocated elsewhere". It tells the compiler "I'm referencing myGlobalvar here, and you haven't seen it before, but that's OK; the linker will know what you are talking about." In your specific example it's not particularly useful, because the compiler does know about myGlobalvar -- it's defined earlier in the same translation unit (.c or .cc file.) You normally use extern when you want to refer to something that is not in the current translation unit, such as a variable that's defined in a library you will be linking to.

(Of course, normally that library would declare the extern variables for you, in a header file that you should include.)

Chuipek answered 16/4, 2010 at 11:42 Comment(0)
S
16

From Here:

A global variable in C/C++ is a variable which can be accessed from any module in your program.

int myGlobalVariable;

This allocates storage for the data, and tells the compiler that you want to access that storage with the name 'myGlobalVariable'.

But what do you do if you want to access that variable from another module in the program? You can't use the same statement given above, because then you'll have 2 variables named 'myGlobalVariable', and that's not allowed. So, the solution is to let your other modules DECLARE the variable without DEFINING it:

extern int myGlobalVariable;

This tells the compiler "there's a variable defined in another module called myGlobalVariable, of type integer. I want you to accept my attempts to access it, but don't allocate storage for it because another module has already done that".

Say answered 16/4, 2010 at 11:44 Comment(0)
P
7

In short: GLOBAL variables are declared in one file. But they can be accessed in another file only with the EXTERN word before (in this another file). In the same file, no need of EXTERN.

for example:

my_file.cpp

int global_var = 3;
int main(){
}

You can access the global variable in the same file. No need to use EXTERN:

my_file.cpp

int global_var = 3;
int main(){
    ++global_var;
    std::cout << global_var; // Displays '4'
}

Global variable, by definition, can also be accessed by all the other files. BUT, in this case, you need to access the global variable using EXTERN.

So, with my_file.cpp declaring the global_var, in other_file.cpp if you try this:

other_file.cpp

int main(){
    ++global_var; // ERROR!!! Compiler is complaining of a 'non-declared' variable
    std::cout << global_var; 
}

Instead, do:

int main(){
    extern int global_var;//Note: 'int global_var' without 'extern' would
                          // simply create a separate different variable
    ++global_var;         // and '++global_var' wouldn't work since it'll
                          // complain that the variable was not initiazed.
    std::cout << global_var; // WORKING: it shows '4'
}
Ppm answered 10/11, 2020 at 18:50 Comment(1)
Great explanationBaez
S
4

Since myGlobalvar has been defined before the function myFunc. Its declaration inside the function is redundant.

But if the definition was after the function, we must have the declaration.

int myFunc(int i)
{
    i = 20 + 1000;
    extern int myGlobalvar; // Declaration must now.
    myGlobalvar = 20000;
    printf("Value of passed value : %d",i);
    return i;
}

int myGlobalvar = 10; // Def after the function.
Seersucker answered 16/4, 2010 at 11:42 Comment(0)
M
1

myGlobalVar as you've defined it is a global variable, visible from all the places in your program. There's no need declaring it extern in the same .c file . That is useful for other .c files to let the compiler know this variable is going to be used.

Melancholic answered 16/4, 2010 at 11:42 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.