Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Метки


Автор: iff 13.12.2016, 19:14
Можно ли в C создать массив меток, точнее указателей, для того, что-бы вместо:
Код

    switch (x) {case 0: goto l1; case 1: goto l2; case 2: goto l3; default: error(); return;};
l1:
    ...
    return;
l2:
    ...
    return;
l3:
    ...
    return;


можно было-бы написаить:
Код

void* L[] = {l1, l2, l3};
if (x <3 ) goto L[x]; else {error(); return;};
l1:
    ...
    return;
l2:
    ...
    return;
l3:
    ...
    return;

Автор: iff 13.12.2016, 19:56
Компилятор GCC должен сам это оптимизировать, или для него можно реализовать переход по таблице самостоятельно: http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html
А вот как это сделать в VS...

Автор: Ivan. 14.12.2016, 06:51
https://m.habrahabr.ru/post/315676/
Метки как значения

Автор: xvr 14.12.2016, 17:48
Цитата(iff @  13.12.2016,  19:56 Найти цитируемый пост)
А вот как это сделать в VS... 

Никак. Взятие адреса метки (и переход на нее) - это расширения GCC, никто другой их не поддерживает (VS точно не поддерживает)

Автор: azesmcar 25.1.2017, 18:51
чем такой вариант не устраивает? 
Код

#include <iostream>

int main()
{
    int labels[] = {1, 2, 3, 4};
    int index = 2;
    switch (labels[index])
    {
    case 1:
        std::cout << "label 1" << std::endl;
    case 2:
        std::cout << "label 2" << std::endl;
    case 3:
        std::cout << "label 3" << std::endl;
    case 4:
        std::cout << "label 4" << std::endl;
    }
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)