I made 2 projects, the first one in C and the second one in C++, both work with same behavior.
C project:
header.h
int varGlobal=7;
main.c
#include <stdio.h>
#include <stdlib.h>
#include "header.h"
void function(int i)
{
static int a=0;
a++;
int t=i;
i=varGlobal;
varGlobal=t;
printf("Call #%d:\ni=%d\nvarGlobal=%d\n\n",a,i,varGlobal,t);
}
int main() {
function(4);
function(6);
function(12);
return 0;
}
C++ project:
header.h
int varGlobal=7;
main.cpp
#include <iostream>
#include "header.h"
using namespace std;
void function(int i)
{
static int a=0;
int t=i;
a++;
i=varGlobal;
varGlobal=t;
cout<<"Call #"<<a<<":"<<endl<<"i="<<i<<endl<<"varGlobal="<<varGlobal<<endl<<endl;
}
int main() {
function(4);
function(6);
function(12);
return 0;
}
I read that global variables are extern by default and in C and static by default in C++; so why does the C++ code works?
I mean int varGlobal=7; is same as static int varGlobal=7; and if it’s static then it can be used only in the file it was declared, right?
Global variables are not
externnorstaticby default on C and C++.When you declare a variable as
static, you are restricting it to the current source file. If you declare it asextern, you are saying that the variable exists, but are defined somewhere else, and if you don’t have it defined elsewhere (without theexternkeyword) you will get a link error (symbol not found).Your code will break when you have more source files including that header, on link time you will have multiple references to
varGlobal. If you declare it asstatic, then it will work with multiple sources (I mean, it will compile and link), but each source will have its ownvarGlobal.What you can do in C++, that you can’t in C, is to declare the variable as
conston the header, like this:And include in multiple sources, without breaking things at link time. The idea is to replace the old C style
#definefor constants.If you need a global variable visible on multiple sources and not
const, declare it asexternon the header, and then define it, this time without the extern keyword, on a source file:Header included by multiple files:
In one of your source files: