MSDN.WhiteKnight - Stack Overflow answers
Ответ на "Можно ли использовать значение переменной в качестве метки для перехода goto?"
Answer 1184681
Раз уж зашла речь об извращениях, вот решение для Visual C++ (только x86):
#include <iostream> #include <map> std::map<char, void*> labels; #define GOTO(x) {void* tmp=labels[x];__asm {jmp tmp}} #define SAVE_LABEL(x,name) {void* tmp;__asm {mov tmp, offset x};labels[name]=tmp;} int main() { SAVE_LABEL(s, 's'); SAVE_LABEL(p, 'p'); GOTO('p') printf("Hello, world!\n"); s: printf("Hello from s!\n"); return 1; p: printf("Hello from p!\n"); return 0; }
Суть способа в том, что хоть goto и не может переходить к переменным, но вот инструкции безусловного перехода, которую он использует, абсолютно наплевать, к чему переходить.
Это приводит нас к такому ассемблерному коду для перехода
__asm {jmp x}
где x - произвольный адрес.
И к такому для получения адреса метки:
__asm {mov x, offset y}
где x - переменная, y - имя метки.
Но тут следует понимать, что ассемблерные вставки непереносимы и мешают компилятору оптимизировать код функции, в которой они присутствуют. Поэтому если вы хотели таким образом состряпать какое-то высокоэффективное решение с таблицами переходов, скорее всего, ничего не выйдет.
Content is retrieved from StackExchange API.
Auto-generated by ruso-archive tools.