Определение макроса с помощью _Generic дает имя типа не разрешено - PullRequest
0 голосов
/ 23 октября 2019

Я пытаюсь определить универсальный макрос, который я намерен использовать с обработкой исключений при отладке кода. Когда я пытаюсь скомпилировать приведенный ниже код, он говорит: typename not allowed. Я нуб, когда дело доходит до макросов, любая помощь очень ценится.


#define ASSERTEXCP(x) _Generic((x),\
char *: printf( "assertion error line %d, file(%s):-> %s\n", __LINE__, __FILE__, x );
char strMsg[2014] = {'\0'}; \
sprintf(strMsg, "\nassertion error line %d, file(%s):-> %s\n", __LINE__, __FILE__, x); \
OutputDebugString(strMsg););


#endif

1 Ответ

0 голосов
/ 23 октября 2019

_Generic - это C-подход к перегрузке C ++. Подход C ++ заключается в использовании if constexpr или перегруженной функции:

    #include <type_traits>

    #define ASSERTEXCP(x) if constexpr (std::is_same<decltype(x), char *>::value) {  \
    printf( "assertion error line %d, file(%s):-> %s\n", __LINE__, __FILE__, x ); \
    char strMsg[2014] = {'\0'}; \
    sprintf(strMsg, "\nassertion error line %d, file(%s):-> %s\n", __LINE__, __FILE__, x); \
    OutputDebugString(strMsg); } 
...