2

Is there a way to determine the "final value" of a expanded C macro by inspecting the compiled object or by running some form of gcc -E on the .c or .h file?

test.h

#define AAA 1
#define BBB 10
#define CCC (AAA+BBB)

test.c

#include <stdio.h>
#include "test.h"

int main(){
   printf("%d\n", CCC);
   return 0;
}

Thus is there someway to get the expanded value either:

#define CCC 11

or

#define CCC (1+10)

If compiled with

gcc -dM -E test.c | grep CCC 

or

gcc -dD -E test.c | grep CCC

outputs

#define CCC (AAA+BBB)

which requires me to still know what AAA and BBB are.

Compiled with:

gcc -E test.c

Gives (skipping the boilerplate):

# 4 "test.c"
int main(){
printf("%d\n", (1+10));
return 0;
}   

While its expanded CCC I've now lost the mapping back to CCC.

Edit: As it was unclear, what i'd like is someway to determine what CCC is (either 11 or 1+10 (as the gcc -E example showed it only inserted (1+10) not 11), preferably without altering the code itself. Printf was a bad idea to use in the MRE, what i actually had in mind was code like:

struct my_struct {
    int my_array[CCC]
    ... other stuff ...
}

The question is how big is my_array, so i can make a struct in another language (python via ctypes) and know how much space i need. I know for structs i can use pahole but was hoping to do this with only gcc and in the more general case (say a global array not in a struct).

alk
  • 69,737
  • 10
  • 105
  • 255
Rob
  • 574
  • 1
  • 4
  • 17

2 Answers2

3

At no point will the preprocessor ever create

#define CCC (1+10)

The expansion of CCC is always (AAA+BBB); it's just that the result of macro expansion is rescanned for more macros to expand, at which point AAA and BBB turn into 1 and 10, respectively.

Perhaps a clearer example of this is

#define AAA 1
#define CCC AAA
#define AAA "hello"

size_t x = sizeof CCC;

This code will expand to "hello", not 1. CCC always has a value of AAA; it's just that by the time size_t x = sizeof CCC; is processed, AAA itself will turn into "hello".

This example also demonstrates that macros can be redefined, so there may not even be a single answer to "what is the value of CCC?".

That's why there's no simple compiler invocation or switch; what you want simply doesn't exist.

That said, if you can use custom code, you can just run e.g.

#define AAA 1
#define BBB 10
#define CCC (AAA+BBB)
CCC

through gcc -P -E and the result will be just (1+10).

melpomene
  • 84,125
  • 8
  • 85
  • 148
1
#include <stdio.h>

#define AAA 1
#define BBB 2
#define CCC (AAA+BBB)

#define STRINGIFY(x) #x
#define PASTE(x) STRINGIFY(x)


int main(void)
{
  printf("CCC = '%s'\n", PASTE(CCC));
}

prints

CCC = '(1+10)'

An alternative version printing the same:

#include <stdio.h>

#define AAA 1
#define BBB 2
#define CCC (AAA+BBB)

#define STRINGIFY(x) #x
#define INTERMEDIATE(x) #x " = '" STRINGIFY(x) "'"

int main(void)
{
  printf("%s\n", INTERMEDIATE(CCC));
}
alk
  • 69,737
  • 10
  • 105
  • 255