2013-09-20 2 views
1

Существует странная функция, как макрос в файле заголовка winbase.h в строке 97 следующим образом:Что такое функциональный макрос Yield() в winbase.h (строка 97)?

#define Yield() 

Для чего это?

+0

Вы можете открыть эти файлы заголовков и посмотреть, почему DBG не определен. Вероятно, это обернуто вокруг другого определения, которое оценивается как false. –

ответ

3

Windows 3.x б/у кооперативный многозадачность модель. Все приложения (также называемые «задачи»), используемые для работы в одном и том же пространстве памяти в одном потоке. Обычно переключение между задачами выполнялось с помощью GetMessage API в главном контуре сообщения приложения. Yield() использовался для добровольного переключения на другое приложение (например, при длительной обработке с использованием ЦП). Вот related MSKB article, который до сих пор сохранился.

Конечно, Yield() API, как это не имеет смысла, с современной многопоточной архитектурой многопроцессорных ОС. Итак, Microsoft заменила его пустым макросом, пытаясь добиться совместимости кода на уровне компиляции.

Любопытно, что в некоторой форме Yield() был reincarnated в .NET 4.5. Его цель - отложить продолжение асинхронного метода на текущем SynchronizationContext (или в потоке пула, если нет контекста синхронизации). Интересная часть этого заключается в том, что использование Task.Yield() в основном потоке пользовательского интерфейса приложения .NET фактически позволяет организовать аналогичный уровень совместной многозадачности, предлагаемый Windows 3.x.

+0

Реальная проблема: у меня есть функция-член с именем Yield, теперь я не могу использовать это имя, потому что оно определено как злой макрос. Мне очень нравится имя для его точного значения в моем классе. Как решить эту проблему? Благодарю. – xmllmx

+0

Просто выполните '#undef Yield' в своем' stdafx.h', после 'windows.h', но перед любыми вашими входящими файлами. – Noseratio

+0

Есть ли способ определить макрос через опцию компилятора? Например, -DName = 1 может определить макрос; Есть ли способ определить неопределенность? – xmllmx

Смежные вопросы