Printing name and value of a macro

前端 未结 11 2558
别跟我提以往
别跟我提以往 2020-12-28 21:46

I have a C program with a lot of optimizations that can be enabled or disabled with #defines. When I run my program, I would like to know what macros have been

相关标签:
11条回答
  • 2020-12-28 22:21

    Wave library from boost can be helpful also to do what you want. If your project is big enough, I think it is worth trying. It is a C++ preprocessor, but they are the same any way :)

    0 讨论(0)
  • 2020-12-28 22:24

    You did not specify the compiler you were using. If this is gcc, gcc -E may help you, as it stops after the preprocessing stage, and prints the preprocessing result. If you diff a gcc -E result with the original file, you may get part of what you want.

    0 讨论(0)
  • 2020-12-28 22:27

    Writing a MACRO that expands to another MACRO would require the preprocessor to run twice on it.
    That is not done.

    You could write a simple file,

    // File check-defines.c
    int printCompileTimeDefines()
    {
    #ifdef DEF1
      printf ("defined : DEF1\n");
    #else // DEF1
      printf ("undefined: DEF1\n");
    #endif // DEF1
    // and so on...
    }
    

    Use the same Compile Time define lines on this file as with the other files.
    Call the function sometime at the start.

    If you have the #DEFINE lines inside a source file rather than the Makefile,
    Move them to another Header file and include that header across all source files,
    including this check-defines.c.

    Hopefully, you have the same set of defines allowed across all your source files.
    Otherwise, it would be prudent to recheck the strategy of your defines.


    To automate generation of this function,
    you could use the M4 macro language (or even an AWK script actually).
    M4 becomes your pre-pre-processor.

    0 讨论(0)
  • 2020-12-28 22:28

    Based on Chrisharris, answer I did this. Though my answer is not very nice it is quite what I wanted.

    #define STR(x)   #x
    #define SHOW_DEFINE(x) printf("%s %s\n", #x, strcmp(STR(x),#x)!=0?"is defined":"is NOT    defined")
    

    Only bug I found is the define must not be #define XXX XXX (with XXX equals to XXX).

    0 讨论(0)
  • 2020-12-28 22:32

    It is not possible indeed, the problem being the "not defined" part. If you'd relied on the macro values to activate/deactivate parts of your code, then you could simply do:

    #define SHOW_DEFINE(X) \
    do { \
    if (X > 0) \
        printf("%s %d\n", #X, (int)X);   \
    else \
        printf("%s not defined\n", #X);   \
    } while(0)
    
    0 讨论(0)
提交回复
热议问题