Added the linker error playground
Here is a project where I was just trying to figure out the nuances of different Translation Units and the scope of variables and function. TLDR: run gcc d.c b.c c.c and see that the linker errors There is storage duration and linkage that can be specified for vars and funtions. There are four different types of Storage Duration Automatic - which is get initialized when the block starts and dies when the block ends Static - which is the entire duration of the program Thread - which i didn't get into really Allocated - which is the typical heap allocation thingys There are three types of linkage. Basically where can you reach a varibale from No Linkage - can only be refered to in the block Internal Linkage - can only be refered to in the same TLU External Linkage - can be reachable by any TLU in the program This shows how defining a variable in 1 h file (a.h), which will have external linkage because it is a file scope variables not declared static will default to, and then #include-ing the h file in multiple other files will lead to redefiniation exceptions thrown by the linker. If confused see more here: https://en.cppreference.com/w/c/language/storage_class_specifiers.html
This commit is contained in:
parent
0c834ca675
commit
69861846a2
6
c_projects/linker_error_pg/a.h
Normal file
6
c_projects/linker_error_pg/a.h
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
#ifndef A_H
|
||||||
|
#define A_H
|
||||||
|
|
||||||
|
int x = 42;
|
||||||
|
|
||||||
|
#endif
|
||||||
7
c_projects/linker_error_pg/b.c
Normal file
7
c_projects/linker_error_pg/b.c
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include "b.h"
|
||||||
|
|
||||||
|
|
||||||
|
int b_print_x(){
|
||||||
|
printf("b.c: x = %d\n", x);
|
||||||
|
}
|
||||||
4
c_projects/linker_error_pg/b.h
Normal file
4
c_projects/linker_error_pg/b.h
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include "a.h"
|
||||||
|
|
||||||
|
int b_print_x();
|
||||||
8
c_projects/linker_error_pg/c.c
Normal file
8
c_projects/linker_error_pg/c.c
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include "c.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int c_print_x(){
|
||||||
|
printf("c.c: x = %d\n", x);
|
||||||
|
}
|
||||||
3
c_projects/linker_error_pg/c.h
Normal file
3
c_projects/linker_error_pg/c.h
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
#include "a.h"
|
||||||
|
|
||||||
|
int c_print_x();
|
||||||
8
c_projects/linker_error_pg/d.c
Normal file
8
c_projects/linker_error_pg/d.c
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
#include "b.h"
|
||||||
|
#include "c.h"
|
||||||
|
|
||||||
|
int main(){
|
||||||
|
b_print_x();
|
||||||
|
c_print_x();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user