Microsoft поставляет с Visual С++ шесть библиотек С/С++. Их краткое описание представлено в следующей таблице.
Имя библиотеки |
Описание |
LibC.lib |
Статически подключаемая библиотека для однопоточных приложений |
LibCD.lih |
Отладочная версия статически подключаемой библиотеки для однопо |
LibCMt.lib |
Статически подключаемая библиотека для многопоточных приложений |
LibCMtD.lib |
Отладочная версия статически подключаемой библиотеки для много |
MSVCRt.lib |
Библиотека импорта для динамического подключения рабочей версии |
MSVCRtD.lib |
Библиотека импорта дли динамического подключения отладочной версии MSVCRtD.dll; поддерживает как одно-, так и многопоточные приложения |
При реализации любого проекта нужно знать, с какой библиотекой его следует связать. Конкретную библиотеку можно выбрать в диалоговом окне Project Settings: на вкладке С/С++ в списке Category укажите Code Generation, а в списке Use Run-Time Library — одну из шести библиотек.
Наверное, Вам уже хочется спросить: "А зачем мне отдельные библиотеки для однопоточных и многопоточных программ?" Отвечаю. Стандартная библиотека С была разработана где-то в 1970 году — задолго до появления самого понятия многопоточности. Авторы этой библиотеки, само собой, не задумывались о проблемах, связанных с многопоточными приложениями.
Возьмем, к примеру, глобальную переменную errno из стандартной библиотеки С. Некоторые функции, если происходит какая-нибудь ошибка, записывают в эту переменную соответствующий код. Допустим, у Вас есть такой фрагмент кода:
BOOL fFailure = (system("NOTEPAD.EXE README.TXT") == -1);
if (fFailure)
{
switch (errno)
{
case E2BIG:
// список аргументов или размер окружения слишком велик
break;
case ENOENT:
// командный интерпретатор не найден
break;
case ENOEXEC;
// неверный формат командного интерпретатора
break;
case ENOMEM:
// недостаточно памяти для выполнения команды
break;
}
Теперь представим, что поток, выполняющий показанный выше код, прерван после вызова функции system и до оператора if.