C macros

Created By: chatGPT

C macros are a powerful feature used in C programming for defining constants and creating inline functions or code snippets that can be reused throughout the code. They are defined using the #define preprocessor directive. Here’s how to use them effectively:
#define PI 3.14
#define SQUARE(x) ((x) * (x))
In the example above, PI is a constant macro that is replaced with the value 3.14 whenever it is encountered in the code. The SQUARE macro takes a single argument x and expands to ((x) * (x)), effectively calculating the square of a number.
int main() {
    float circle_area = PI * SQUARE(2.0);
    printf("Circle Area: %f\n", circle_area);
    return 0;
}
One important detail to consider with macros is that they do not perform type checking. This means that passing an incompatible type could lead to unexpected behavior. It’s crucial to ensure that the correct type is passed to the macros.
#define MAX(a, b) ((a) > (b) ? (a) : (b))

int main() {
    int max_val = MAX(10, 20);
    printf("Max Value: %d\n", max_val);
    return 0;
}
Macros can also be conditional using the #ifdef, #ifndef, #endif, and other similar directives. This allows code to be included or excluded based on whether a macro is defined.
#define DEBUG

#ifdef DEBUG
    #define LOG(msg) printf("DEBUG: %s\n", msg)
#else
    #define LOG(msg)
#endif

int main() {
    LOG("This is a debug message.");
    return 0;
}
While macros are powerful, they are also potentially dangerous because they do not obey the usual rules of scope. Macros can lead to subtle bugs if not used carefully, particularly with side effects in expanded expressions.
#define INCREMENT(x) ((x) + 1)

int main() {
    int a = 1;
    int b = INCREMENT(a++);
    printf("a: %d, b: %d\n", a, b);
    return 0;
}
To summarize, C macros provide a way to define reusable code and constants which can simplify code management but should be used with care due to their potential quirks and lack of type safety. Understanding these underlying principles will help you leverage macros effectively in your C programming.
void print_version() {
    printf("Version: 1.0.0\n");
}

#define VERSION print_version()

int main() {
    VERSION;
    return 0;
}
Introduction And SetupVariablesData TypesIntFloatDoubleCharVoidUnsignedSignedConstantsEnumerationsArraysStringsStructsUnionsTypedefsPointersDynamic Memory AllocationMallocCallocReallocFreeFunctionsFunction DeclarationsFunction DefinitionsFunction CallsReturn StatementInline FunctionsRecursionHeader FilesPreprocessor DirectivesControl FlowIf StatementElse StatementElse If StatementSwitch StatementCase StatementDefault CaseLoopsFor LoopWhile LoopDo While LoopBreak StatementContinue StatementGoto StatementLabelsOperatorsArithmetic OperatorsRelational OperatorsLogical OperatorsBitwise OperatorsAssignment OperatorsConditional (ternary) OperatorComma OperatorSizeof OperatorData StructuresLinked ListsStacksQueuesTreesGraphsFunction PointersCallbacksMacrosCommentsSingle Line CommentsMulti Line CommentsSyntaxSyntax ErrorsCompilation ErrorsDebuggingStandard Input OutputPrintfScanfFile HandlingFopenFcloseFreadFwriteFprintfFgetsFputsError HandlingErrnoAssertionsExit FunctionExit CodesEvent HandlingSignal HandlingInterrupts