Метки переопределены в макросе в C - PullRequest
0 голосов
/ 21 октября 2019

Попытка использовать метки goto в макросе C (работает MSVC), но если макрос вызывается несколько раз в одной и той же функции вызывающей стороны, появляются переопределенные ошибки меток C2045.

Я пытался использовать __label__ из этогопример: https://www.geeksforgeeks.org/local-labels-in-c/ но это ключевое слово label, вероятно, gcc только потому, что MSVC сообщает о метке undefined.

Я понимаю, что это действительно запутанно и глупо, но я пишу транспортер для преобразования кода MASM в C. ВMASM, метки определяются локально с помощью директивы LOCAL, __label__ используется GCC, но что MSVC предлагает в качестве решения?

#include <stdint.h>
#include <stdio.h>

#define     Loopy(AA) {              \
   RTSZ_0:;                          \
   if (AA >= 5) { goto RTSZ_1; }     \
   AA += 1;                          \
   goto RTSZ_0;                      \
   RTSZ_1:;                          \
}                               

int main()
{
    int AA = 0;

    Loopy(AA);
    Loopy(AA);

    return 0;
}

Я ожидал, что меткам goto будет назначена уникальная метка, чтобы привключенный несколько раз, не будет ошибок переопределения.

Есть ли ключевое слово C, которое можно применить к макросу или обходному пути? Что-то вроде:

            __Uniquelabel__       RTSZ_0; \
            __Uniquelabel__       RTSZ_1; \

Есть идеи? Спасибо!

1 Ответ

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

в настоящее время изучает возможность использования этого кода:

#define S1(x) #x
#define S2(x) S1(x)
#define RTSZ "RTSZ_" S2(__LINE__) ":"

Действительно, что-то, указанное выше, может быть использовано для генерации уникальных меток, если не более одного вызова макроса наисходная строка:

#define RTSZ(i) RTSZ1(i, __LINE__)
#define RTSZ1(i, l) RTSZ2(i, l)
#define RTSZ2(i, l) RTSZ_##i##_##l

#define     Loopy(AA) {              \
   RTSZ(0):                          \
   if (AA >= 5) { goto RTSZ(1); }    \
   AA += 1;                          \
   goto RTSZ(0);                     \
   RTSZ(1): ;                        \
}

Промежуточный макрос RTSZ1() служит для расширения макроса __LINE__, аналогично S2() в вашем подходе.

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