C weak symbols are linker-level symbols that can be overridden. Declare a function or variable __attribute__((weak)) (GCC/Clang) to allow another compilation unit to provide a strong override. Useful for plugin systems, default implementations, or optional features.
Use weak symbols to provide default implementations that users can override at link time.
// compile: gcc -o weak weak.c default.c plugin.c // run: ./weak // description: weak symbols for overridable functions // weak.c (main program) #include <stdio.h> // Declare as weak - can be overridden void custom_handler(void) __attribute__((weak)); void custom_handler(void) { printf("Default handler\n"); } int main() { custom_handler(); return 0; } // default.c (default implementation) void default_func(void) { printf("Default implementation\n"); } // plugin.c (override) #include <stdio.h> void custom_handler(void) { printf("Plugin override handler\n"); }
Weak function:
__attribute__((weak))Weak variable:
int global __attribute__((weak)) = 0;Plugin systems:
Portability:
__attribute__((weak))#pragma weak (different syntax)Limitations:
Best practices: