Difficulty: Easy
Correct Answer: Correct
Explanation:
Introduction / Context:
Clean modular C design relies on header files to share interfaces and cross-module contracts. Understanding what is appropriate to place in headers versus source files helps avoid linkage errors and promotes maintainability.
Given Data / Assumptions:
Concept / Approach:
Headers are primarily for declarations, not definitions of functions with bodies. They usually contain macro definitions (#define), typedefs, structure/union/enum declarations, and function prototypes so that multiple translation units can compile against the same interface. Some headers also contain inline functions or static inline helpers, guarded by include guards to prevent multiple definition issues.
Step-by-Step Solution:
Macros: Provide constants and helper expressions (e.g., #define PI 3.14159f) or feature toggles.Structure declarations: Declare data layouts (e.g., struct point { int x, y; };) so different modules agree on memory layout.Function prototypes: Declare signatures (e.g., int foo(int);) enabling type checking across source files before linking.Include guards or #pragma once prevent multiple inclusion problems.
Verification / Alternative check:
Inspect standard headers such as stdlib.h or string.h; they contain typedefs, macros, and prototypes, with minimal or no non-inline function definitions.
Why Other Options Are Wrong:
“Incorrect” would deny widely accepted practice; headers containing only function bodies is bad practice (place them in .c files unless inline); variable definitions in headers can cause multiple definitions unless made extern or inline for functions; limiting headers to only one kind of declaration is unnecessary.
Common Pitfalls:
Placing non-const global definitions in headers, leading to ODR/multiple-definition errors; omitting include guards; overusing macros instead of enums/consts.
Final Answer:
Correct
Discussion & Comments