VS2005: Как компилировать проекты, как если бы это был VS6?

У меня есть проект, который я создаю с помощью Visual Studio 2005. Источники также используются в другом проекте, который создается с использованием Visual Studio 6.

Это приводит к потенциальным ошибкам, поскольку новые _s-функции, представленные тегом Улучшения безопасности в CRT отсутствуют в VS6.

Чтобы мои источники также хорошо работали с VS6, не сохраняя при этом отдельную установку VS6, я хотел бы скомпилировать их с VS2005, но отключить новые безопасные функции (введенные тегом Улучшения безопасности). Это возможно?


person eckes    schedule 16.09.2011    source источник


Ответы (3)


Вы можете отключить предупреждение о небезопасных функциях, указав _CRT_SECURE_NO_WARNINGS. Также вы можете добавить условно скомпилированную оболочку для функции _s: в VS2005 и более поздних версиях используйте функции _s, а во всех остальных случаях используйте упакованные функции _s, которые просто вызывают обычные функции.

person Sergey Podobry    schedule 16.09.2011
comment
Я не хочу отключать предупреждения. Я хочу использовать защищенные функции, пока они доступны. - person eckes; 16.09.2011
comment
+1 за упоминание возможности фантиков. Но чтобы иметь возможность реализовать обертки, я должен знать, какие функции нужно обернуть. Да, я мог бы посмотреть на msdn.microsoft.com /en-us/library/wd3wzwts(v=vs.80).aspx и grep мои источники для этих функций, но я ищу автоматический способ получить указание на эти функции. - person eckes; 16.09.2011

Файлы (фреймворк, библиотеки, сборки), используемые VS .Net и VS6, совершенно разные. Хотя можно использовать некоторые библиотеки из VS6 с помощью COM-оболочки, вы не получите полной совместимости с VS6 в VS.Net.

Если это важно, одноразовая попытка переноса кода будет полезна.

person Abhijeet Pathak    schedule 16.09.2011
comment
Конечно, я знаю преимущества использования безопасных функций. Но, как я уже сказал, мой проект используется в другом проекте, который компилируется с vS6 и который не будет перенесен на VS2005. - person eckes; 16.09.2011

ответ, данный Сергием вдохновил меня на запуск дома:

  • реализовать оболочки для безопасных функций в файле secure.c
  • проверить наличие защищенных функций можно с помощью
    #if (_MSC_VER >= 1400)
  • возьмите список версий функций CRT с усиленной безопасностью в файл
  • поиск по каждому шаблону в моих источниках, используя эти несколько строк на консоли cygwin:
    for i in $(cat secure_functions.txt)
    do
    grep -rn --exclude "secure.c" -w $i path/to/sources
    done
  • Это указывает мне на места, где встречаются новые функции.

Резервное копирование: если кто-то хочет это сделать, вот список безопасных функций:

_access_s
_waccess_s
_malloca
asctime_s
_wasctime_s
bsearch_s
_cgets_s
_cgetws_s
_chsize_s
clearerr_s
_controlfp_s
_cprintf_s
_cprintf_s_l
_cwprintf_s
_cwprintf_s_l
_cscanf_s
_cscanf_s_l
_cwscanf_s
_cwscanf_s_l
_ctime_s
_ctime32_s
_ctime64_s
_wctime_s
_wctime32_s
_wctime64_s
_ecvt_s
_fcvt_s
fopen_s
_wfopen_s
fprintf_s
_fprintf_s_l
fwprintf_s
_fwprintf_s_l
freopen_s
_wfreopen_s
fscanf_s
_fscanf_s_l
fwscanf_s
_fwscanf_s_l
_ftime_s
_ftime32_s
_ftime64_s
_gcvt_s
getenv_s
_wgetenv_s
gets_s
_getws_s
_gmtime32_s
_gmtime64_s
_itoa_s
_i64toa_s
_ui64toa_s
_itow_s
_i64tow_s
_ui64tow_s
_lfind_s
localtime_s
_localtime32_s
_localtime64_s
_lsearch_s
_ltoa_s
_ltow_s
_makepath_s
_wmakepath_s
_mbccpy_s
_mbccpy_s_l
_mbsnbcat_s
_mbsnbcat_s_l
_mbsnbcpy_s
_mbsnbcpy_s_l
mbsrtowcs_s
mbstowcs_s
_mbstowcs_s_l
memcpy_s
wmemcpy_s
memmove_s
wmemmove_s
_mktemp_s
_wmktemp_s
printf_s
_printf_s_l
wprintf_s
_wprintf_s_l
_putenv_s
_wputenv_s
qsort_s
rand_s
scanf_s
_scanf_s_l
wscanf_s
_wscanf_s_l
_searchenv_s
_wsearchenv_s
_snprintf_s
_snprintf_s_l
_snwprintf_s
_snwprintf_s_l
_snscanf_s
_snscanf_s_l
_snwscanf_s
_snwscanf_s_l
_sopen_s
_wsopen_s
_splitpath_s
_wsplitpath_s
sprintf_s
_sprintf_s_l
swprintf_s
_swprintf_s_l
sscanf_s
_sscanf_s_l
swscanf_s
_swscanf_s_l
strcat_s
wcscat_s
_mbscat_s
strcpy_s
wcscpy_s
_mbscpy_s
_strdate_s
_wstrdate_s
strerror_s
_strerror_s
_wcserror_s
__wcserror_s
_strlwr_s
_strlwr_s_l
_mbslwr_s
_mbslwr_s_l
_wcslwr_s
_wcslwr_s_l
strncat_s
_strncat_s_l
wcsncat_s
_wcsncat_s_l
_mbsncat_s
_mbsncat_s_l
strncpy_s
_strncpy_s_l
wcsncpy_s
_wcsncpy_s_l
_mbsncpy_s
_mbsncpy_s_l
_strtime_s
_wstrtime_s
strtok_s
_strtok_s_l
wcstok_s
_wcstok_s_l
_mbstok_s
_mbstok_s_l
_strupr_s
_strupr_s_l
_mbsupr_s
_mbsupr_s_l
_wcsupr_s
_wcsupr_s_l
tmpfile_s
tmpnam_s
_wtmpnam_s
_ultoa_s
_ultow_s
_umask_s
_vcprintf_s
_vcprintf_s_l
_vcwprintf_s
_vcwprintf_s_l
vfprintf_s
_vfprintf_s_l
vfwprintf_s
_vfwprintf_s_l
vprintf_s
_vprintf_s_l
vwprintf_s
_vwprintf_s_l
vsnprintf_s
_vsnprintf_s
_vsnprintf_s_l
_vsnwprintf_s
_vsnwprintf_s_l
vsprintf_s
_vsprintf_s_l
vswprintf_s
_vswprintf_s_l
wcrtomb_s
wcsrtombs_s
wcstombs_s
_wcstombs_s_l
wctomb_s
_wctomb_s_l
person eckes    schedule 16.09.2011