andreasfertig / cppinsights

C++ Insights - See your source code with the eyes of a compiler
https://cppinsights.io
MIT License
4.08k stars 240 forks source link

Complex macros are not expanded #376

Closed SpriteOvO closed 7 months ago

SpriteOvO commented 3 years ago

Issue example: https://cppinsights.io/s/8931a54c

Input:

/* ... better-enums library code ... */

#include <cstdio>
#include <iostream>

BETTER_ENUM(Word, int, Hello, World)

int main()
{
#define ARR_SIZE 10

    const char arr[ARR_SIZE]{2,4,6,8};

    for(const char& c : arr)
    {
      printf("c=%c\n", c);
    }

    std::cout << (+Word::Hello)._to_string() << ", "
              << (+Word::World)._to_string() << "!"
              << std::endl;
}

Output:

/* ... better-enums library code ... */

#include <cstdio>
#include <iostream>

BETTER_ENUM(Word, int, Hello, World)

int main()
{
  const char arr[10] = {2, 4, 6, 8, '\0', '\0', '\0', '\0', '\0', '\0'};
  {
    char const (&__range1)[10] = arr;
    const char * __begin1 = __range1;
    const char * __end1 = __range1 + 10L;
    for(; __begin1 != __end1; ++__begin1) 
    {
      const char & c = *__begin1;
      printf("c=%c\n", static_cast<int>(c));
    }

  }
  std::operator<<(std::operator<<(std::operator<<(std::operator<<(std::cout, (operator+(Word::Hello))._to_string()), ", "), (operator+(Word::World))._to_string()), "!").operator<<(std::endl);
}

I'm exploring a library better-enums and I'd like to see what the BETTER_ENUM macro looks like when it expanded for the compiler, but Cppinsights' macro expansion doesn't work for it, although it works fine for ARR_SIZE macro.

I guess because the BETTER_ENUM macro is too complex, will there be plans to support complex macro expansion?


And is there a way to directly include an online url like Godbold? So that users no longer need to add library code manually.

#include <https://raw.githubusercontent.com/aantron/better-enums/master/enum.h>

:heart: Thank you for the great site!

andreasfertig commented 3 years ago

Hello @SpriteOvO,

thanks for reporting this issue. Macros are, well, difficult. I assume some of the matchers does not work here. In general macros do work. In your case, a workaround is to wrap BETTER_ENUM(Word, int, Hello, World) in a namespace:

namespace test {
BETTER_ENUM(Word, int, Hello, World)
}

Then it gets expanded.

And is there a way to directly include an online url like Godbold? So that users no longer need to add library code manually. No this doesn't work in C++ Insights. You're welcome to send me a PR.

❤️ Thank you for the great site! My pleasure.

Andreas