Почему этот макрос компилятор зависит? - PullRequest
0 голосов
/ 03 октября 2019

Я занимаюсь разработкой нескольких многоуровневых программ, и мне нужен макрос, который помогает обнаруживать изменения в переменной. Я хотел бы использовать этот макрос для обнаружения триггеров в var:

#define TRIG_UP(X)          ({  \
                                static  typeof(X) __val_ant=0; \
                                unsigned char __trig = (X) && !__val_ant; \
                                __val_ant = (X); \
                                (__trig );\
                            })

для использования в таких инструкциях, как:

if (TRIG_UP(var1))
    var2 = TRIG_UP(var3);

компиляция с последним GCC и arm-gcc, он прекрасно работает, но с другими компиляторами (Visual Studio или Integrity) я получаю некоторые ошибки в объявлении. У меня вопрос, почему этот макрос зависит от компилятора? Это зависит от стандарта языка C? Как я могу сделать его совместимым со всеми ситуациями?

Спасибо всем!

Я получаю следующие ошибки:

error #29: expected an expression
      var2 = ({

или

 error C2059: syntax error : '{

в зависимости от компилятора.

1 Ответ

5 голосов
/ 03 октября 2019

Потому что typeof - это не стандартный C, а расширение gcc. Вместо этого вы можете попробовать переписать его, используя стандартный _Generic.

Более того, идентификаторы, начинающиеся с двойного подчеркивания __, зарезервированы для реализации стандартной библиотеки и не должны использоваться в другом коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...