What is the purpose and linking mechanism of extern keyword in C language?
extern Keyword Basic Concepts:
-
Declaring External Variables
c// file1.c int global_var = 100; // file2.c extern int global_var; // Declaration, no memory allocation void function() { global_var = 200; // Access variable in file1.c } -
Declaring External Functions
c// file1.c int add(int a, int b) { return a + b; } // file2.c extern int add(int a, int b); // extern can be omitted void use_add() { int result = add(3, 5); }
Linking Mechanism:
-
Internal vs External Linkage
c// Internal linkage (static) static int internal_var = 10; static void internal_func() {} // External linkage (default) int external_var = 20; void external_func() {} // Explicit external linkage extern int explicit_var = 30; extern void explicit_func() {} -
Cross-File Sharing
c// config.h extern int MAX_CONNECTIONS; extern const char* LOG_FILE; // config.c int MAX_CONNECTIONS = 100; const char* LOG_FILE = "app.log"; // main.c #include "config.h" int main() { printf("Max connections: %d\n", MAX_CONNECTIONS); }
Usage Scenarios:
-
Header File Declarations
c// mylib.h #ifndef MYLIB_H #define MYLIB_H extern int library_version; extern void library_init(); extern void library_cleanup(); #endif -
Avoiding Duplicate Definitions
c// common.h extern int shared_counter; // file1.c #include "common.h" int shared_counter = 0; // Definition // file2.c #include "common.h" // Only declaration, no definition -
Conditional Compilation
c// platform.h #ifdef _WIN32 extern void windows_specific(); #elif defined(__linux__) extern void linux_specific(); #endif
Important Considerations:
-
Declaration vs Definition
c// Declaration (no memory allocation) extern int var1; // Definition (memory allocation) int var1 = 10; extern int var2 = 20; // Also a definition -
extern with const Variables
c// const variables have internal linkage by default const int CONSTANT = 100; // Need explicit external linkage extern const int EXTERN_CONSTANT = 200; -
Initialization
c// Correct extern int var; // Declaration int var = 10; // Definition // Wrong extern int var = 10; // Legal but not recommended
Advanced Applications:
-
Dynamic Linking Libraries
c// mylib.c __declspec(dllexport) int lib_function(int x) { return x * 2; } // main.c __declspec(dllimport) int lib_function(int x); -
Inline Functions
c// header.h static inline int max(int a, int b) { return a > b ? a : b; } -
Macros with extern
c// api.h #ifdef API_EXPORTS #define API __declspec(dllexport) #else #define API __declspec(dllimport) #endif API void api_function();
Best Practices:
-
Header File Organization
c// module.h #ifndef MODULE_H #define MODULE_H #ifdef __cplusplus extern "C" { #endif extern int module_init(); extern void module_cleanup(); #ifdef __cplusplus } #endif #endif -
Avoid Global Variables
c// Not recommended extern int global_state; // Recommended: Use accessor functions int get_state(); void set_state(int value); -
Namespace Simulation
c// network.h extern int network_init(); extern void network_send(const char* data); // file.h extern int file_open(const char* path); extern void file_write(int fd, const char* data);
Common Errors:
-
Duplicate Definitions
c// file1.c int shared_var = 10; // file2.c int shared_var = 20; // Link error: duplicate definition -
Undefined References
c// file1.c extern int undefined_var; void function() { int x = undefined_var; // Link error: undefined reference } -
Type Mismatch
c// file1.c int value = 10; // file2.c extern double value; // Link error: type mismatch