Home > Mobile >  C macro to get member of struct
C macro to get member of struct

Time:10-18

Consider the following program:

#include <stdio.h>

typedef struct structType {
    int someVal;
    int otherVal;

    // ...more members used for other purposes
} structType;

void myFunc(structType * theStruct, int theVal) {
    // Do something
}

int main()
{
    structType myStruct;
    
    myStruct.someVal = 5;
    myStruct.otherVal = 10;
    
    myFunc(&myStruct, myStruct.someVal);
    myFunc(&myStruct, myStruct.otherVal);

    return 0;
}

When calling myFunc() I need to pass both a pointer to the struct itself, and one of the values contained withing the struct.

Can I somehow make a macro so that myFunc() could be called something like:

MY_FUNC_MACRO(myStruct, someVal);
MY_FUNC_MACRO(myStruct, otherVal);

So that the struct pointer only needs to be typed once, and then the name of the member variable without passing the struct name once again.

I know about the stringilize macros like # an ##, but afaik that only goes from literal name to string. I need to go the other way, to somehow concatenate multiple strings into one literal name.

CodePudding user response:

You don't need anything fancy

#define MY_FUNC_MACRO(A,B) (myFunc(&(A), (A).B))

works.

It's a little bit fragile though because B could be anything.

If you've got more nested structs and the middle layer is known at compile time, you can do this:

#define MY_FUNC_MACRO(A,B) (myFunc(&(A), (A).memberStruct.B))

CodePudding user response:

I think you can simply use typedef like:

typedef structTypePointer *structType;

and the caller to function turn into:

myFunc(structTypePointer, myStruct.someVal);

or

myFunc(structTypePointer, structTypePointer->someVal);
  • Related