简体   繁体   中英

handling operations with macros in C

I'm new to dealing with Macros and I've just stumbled into an exercise that I can't figure it out. Could someone explain to me what's happening here? If I compile i can see what the output is but i can't get it there myself. Thank you in advance!

#define M(varname, index) ( ( (unsigned char*) & varname )[index] ) 

int main(void) {
int a = 0x12345678; 
printf( "%x %x\n", M(a,0), M(a,3) );
printf( "%x %x\n", M(a,1), M(a,2) );
}

Each Macro usage M(x,y) is replaced with ( (unsigned char*) & x )[y]

So your code looks like this after preprocessing:

int main(void) {
    int a = 0x12345678; 
    printf( "%x %x\n", ( (unsigned char*) & a )[0], ( (unsigned char*) & a )[3] );
    printf( "%x %x\n", ( (unsigned char*) & a )[1], ( (unsigned char*) & a )[2] );
}

Like Thomas B Preusser added in the OP Question comments, most C compiler suites allow to get the pre-processed code with certain compiler flags or tools like fe with GCC as mentioned here.

Macros work by replacing one thing with another before attempting to compile the code (preprocessing). So in the example you gave:

#define M(varname, index) ( ( (unsigned char*) & varname )[index] ) 

Each time a M(varname, index) occurs, it will be replaced by ( (unsigned char*) & varname )[index]

In terms of what the code is doing, as an example (reformatted slightly for readability):

printf("%x %x\n", ((unsigned char*) &a)[0], ((unsigned char*) &a)[3]);

This:

  • takes the address of variable a
  • casts the address to an unsigned char*
  • gets the 0th element in this pointer/array
  • formats it into the string, replacing the first %x , as hex ( %x is for hex)

It repeats this for the 3rd element with the second %x

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM