Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Listing C Constants/Macros

Is there a way to make the GNU C Preprocessor, cpp (or some other tool) list all available macros and their values at a given point in a C file?

I'm looking for system-specific macros while porting a program that's already unix savvy and loading a sparse bunch of unix system files.

Just wondering if there's an easier way than going hunting for definitions.

like image 335
ZJR Avatar asked Mar 10 '10 23:03

ZJR


People also ask

What is a macro constant in C?

Description. In the C Programming Language, the #define directive allows the definition of macros within your source code. These macro definitions allow constant values to be declared for use throughout your code. Macro definitions are not variables and cannot be changed by your program code like variables.

What is the difference between macro and constant in C?

Macros are handled by the pre-processor - the pre-processor does text replacement in your source file, replacing all occurances of 'A' with the literal 8. Constants are handled by the compiler. They have the added benefit of type safety.

How #define works in C?

The #define creates a macro, which is the association of an identifier or parameterized identifier with a token string. After the macro is defined, the compiler can substitute the token string for each occurrence of the identifier in the source file.

How do I print a macro value?

Here we will see how to define a macro called PRINT(x), and this will print whatever the value of x, passed as an argument. To solve this problem, we will use the stringize operator. Using this operator the x is converted into string, then by calling the printf() function internally, the value of x will be printed.


2 Answers

I don't know about a certain spot in a file, but using:

$ touch emptyfile
$ cpp -dM emptyfile

Dumps all the default ones. Doing the same for a C file with some #include and #define lines in it includes all those as well. I guess you could truncate your file to the spot you care about and then do the same?

From the man page:

-dCHARS
CHARS is a sequence of one or more of the following characters, and must not be preceded by a space. Other characters are interpreted by the compiler proper, or reserved for future versions of GCC, and so are silently ignored. If you specify characters whose behavior conflicts, the result is undefined.

M
Instead of the normal output, generate a list of #define directives for all the macros defined during the execution of the preprocessor, including predefined macros. This gives you a way of finding out what is predefined in your version of the preprocessor. Assuming you have no file foo.h, the command

    touch foo.h; cpp -dM foo.h

will show all the predefined macros.

If you use -dM without the -E option, -dM is interpreted as a synonym for -fdump-rtl-mach.

D
Like M except in two respects: it does not include the predefined macros, and it outputs both the #define directives and the result of preprocessing. Both kinds of output go to the standard output file.

N
Like D, but emit only the macro names, not their expansions.

I
Output #include directives in addition to the result of preprocessing.

like image 188
Carl Norum Avatar answered Nov 16 '22 01:11

Carl Norum


With gcc, you can use the "-dD" option to dump all the macro definitions to stdout.

like image 25
JayM Avatar answered Nov 16 '22 01:11

JayM