Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronic Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

Register Log in

global extern vs and l extern variable

John99407

Newbie level 3
Joined
Jul 14, 2019
Messages
4
Helped
0
Reputation
0
Reaction score
0
Trophy points
1
Activity points
86
Variable may be two type local or global. I am not clear about the life time and scope of global extern variable and local extern variable

does difference only with the life time not in scope ?
 

srizbf

Advanced Member level 5
Joined
Apr 3, 2010
Messages
1,995
Helped
417
Reputation
840
Reaction score
328
Trophy points
1,363
Activity points
10,985
variables declared within a block is local. It is 'auto' storage class by default
and discarded on exit from block. Their scope is within the block.

variables with 'static' storage class retain their values across exit.
it can be local , or external to all blocks.Their scope is everywhere.


They can be made global by using 'extern' keyword storage class.
 

betwixt

Super Moderator
Staff member
Joined
Jul 4, 2009
Messages
14,179
Helped
4,684
Reputation
9,383
Reaction score
4,437
Trophy points
1,393
Location
Aberdyfi, West Wales, UK
Activity points
121,095
I think 'local extern' is a misnomer, local means just that, extern means it is defined in a different code module so it can't be local at the same time.

Brian.
 

KlausST

Super Moderator
Staff member
Joined
Apr 17, 2014
Messages
17,435
Helped
3,938
Reputation
7,874
Reaction score
3,811
Trophy points
113
Activity points
115,599
Hi,

I´m no C expert, so please experts correct me if I´m wrong:

Just some notes:
"local" does not need to be written in the code (never), because it is the default - if a variable is declared in a block or function.

"global" does not need to be written either. A variable is called global if it is declared outside of all blocks/functions. (usually at the top of a file)

"external" needs to be written to a variable declaration inside a block/function ... Wrong: to notify that the variable/value should be available even outside the block/function.
[Edited (greyed out) after post#5 to avoid spreading wrong informations. Please refer to post#5]

Klaus
 

betwixt

Super Moderator
Staff member
Joined
Jul 4, 2009
Messages
14,179
Helped
4,684
Reputation
9,383
Reaction score
4,437
Trophy points
1,393
Location
Aberdyfi, West Wales, UK
Activity points
121,095
Almost Klaus - we will make a 'C' programmer of you yet :-D

You are right about the local and global definitions but 'extern' is used when more than one source file refers to the same variable. One source file defines it, the others refer to it as 'extern' so the linker knows they are the same thing and not a new variable with the same name.

example: file_1.c contains
int MyVariable;

file_2.c contains:
extern int MyVariable;

then 'MyVariable' is the same storage location for both files. The 'extern' reference can also be in a header (.h or .inc) file with the same effect. Without it, the second or subsequent files will generate their own storage with the name being local to that source file only.

There are external and public references used in C++ to specify which variables or functions are shared but that's a different matter.

Brian.
 

KlausST

Super Moderator
Staff member
Joined
Apr 17, 2014
Messages
17,435
Helped
3,938
Reputation
7,874
Reaction score
3,811
Trophy points
113
Activity points
115,599
Hi,

Thanks Brian for clarifying this (I thought it was the other way round).
I´m still learning. Currently I can read C code quite good, but am unable to write "clean" C code.

we will make a 'C' programmer of you yet
I hope so :)

Klaus
 

John99407

Newbie level 3
Joined
Jul 14, 2019
Messages
4
Helped
0
Reputation
0
Reaction score
0
Trophy points
1
Activity points
86
Almost Klaus - we will make a 'C' programmer of you yet :-D

You are right about the local and global definitions but 'extern' is used when more than one source file refers to the same variable. One source file defines it, the others refer to it as 'extern' so the linker knows they are the same thing and not a new variable with the same name.

example: file_1.c contains
int MyVariable;

file_2.c contains:
extern int MyVariable;

then 'MyVariable' is the same storage location for both files. The 'extern' reference can also be in a header (.h or .inc) file with the same effect. Without it, the second or subsequent files will generate their own storage with the name being local to that source file only.

There are external and public references used in C++ to specify which variables or functions are shared but that's a different matter.

Brian.
Hi brian thank you,

What will be the out ? Will it MyVariable = 101
Code:
void function ()
{
  extern int MyVariable = 100;
}
  
int main()
{
  
    MyVariable++;
     
    printf( "MyVariable; = %d", MyVariable);
  
return 0;
}
 

betwixt

Super Moderator
Staff member
Joined
Jul 4, 2009
Messages
14,179
Helped
4,684
Reputation
9,383
Reaction score
4,437
Trophy points
1,393
Location
Aberdyfi, West Wales, UK
Activity points
121,095
extern int MyVariable = 100;
isn't really valid code although it might compile.
You wouldn't normally place it in a function, it would go at the top of the source file as "extern int MyVariable;" to indicate it was defined in a different source file.

In a program with a single source (.c) file 'extern' has no meaning. It is used when there is more than one source file, the definition in one and the 'extern' reference in the others. When a program has more than one source file, each source is compiled as though it was a program in its own right. Before it can be come an executable program, all the source files and any libraries used are fed to a 'linker' program that resolves the cross references between them so they can share variables and functions if necessary. The 'extern' tells the linker not to allocate space to store the variable but instead to use the space already allocated in another source file. Hence, each source file can 'see' the same variable even though it wasn't defined within its own code.

So in your case it would be something like:
Source file 1:
Code:
int MyVariable = 100;
and in source file 2:
Code:
extern int MyVariable;
int main()
{
  
    MyVariable++;
     
    printf( "MyVariable; = %d", MyVariable);
  
return 0;
}
which would print "MyVariable; = 101"

Brian.
 

John99407

Newbie level 3
Joined
Jul 14, 2019
Messages
4
Helped
0
Reputation
0
Reaction score
0
Trophy points
1
Activity points
86
@betwixt I have very difficult time to understand storage class in c language. I have spend so much time on google and tried to understand basic

I am describing life time and scope of variable Take a look at code

Code:
#include <stdio.h>

   int a = 1;
   static int b = 1;
   extern int c = 1;
   
   void storage ()
   {
       int x = 1;
       static int y = 1;
       x++;
       y++;
      printf(" x = %d\n", x) ;
	  printf(" y = %d\n", y) ;
   }
  
    int main ()
	{
	  
	  
	  printf(" a = %d\n", a) ;
	  printf(" b = %d\n", b);
	  printf(" c = %d\n", c);
	  c++;
	  
	  printf(" c = %d\n", c);
	  storage ();
	  printf("\n");
	  storage ();
	  
      return 0;	  
	}
a = 1 ( a is accessible in this source file and it will stay alive for life time of program )
b = 1 ( b is accessible in this source file and it will stay alive for life time of program )
c = 1 ( c is accessible in this source file as well as other source file and it will stay alive for life time of program )
c = 2
x = 2 ( x is accessible in function storage only and it will stay alive until function exist )
y = 2 ( y is accessible in function storage only and it will stay alive for life time of program )

x = 2
y = 3

Remember : you explained use of extern keyword with different source and I am agree with you but I am using extern in same soure in my example and it's valid

Am I wrong somewhere ?
 

std_match

Advanced Member level 4
Joined
Jul 9, 2010
Messages
1,083
Helped
409
Reputation
818
Reaction score
404
Trophy points
1,363
Location
Sweden
Activity points
8,276
a is accesible in this source file, and in other source files if they have an "extern" declaration
b is only accessible in this source file
c is declared somewhere else (that is the meaning of "extern"), and the assignment in the extern declaration is meaningless, even if it compiles.

Edit:
I now see that you have compiled and executed the source code. It seems that the compiler/linker is too kind to you. I expected a linking error if you don't have a declaration of c without "extern" somewhere.

- - - Updated - - -

My compiler does not like your code (extern declaration with assignment), but it compiles:

Code:
linux% make ext
cc     ext.c   -o ext
ext.c:5:15: warning: 'c' initialized and declared 'extern' [enabled by default]
    extern int c = 1;
You should not use code with such warnings.
 
Last edited:

betwixt

Super Moderator
Staff member
Joined
Jul 4, 2009
Messages
14,179
Helped
4,684
Reputation
9,383
Reaction score
4,437
Trophy points
1,393
Location
Aberdyfi, West Wales, UK
Activity points
121,095
My compiler gcc says:
warning: ‘c’ initialized and declared ‘extern’
5 | extern int c = 1;
| ^
Just for fun I put it in a PIC C compiler and it bombed out with "unplaced extern variable 'c'".

Brian.
 

Toggle Sidebar

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Top