Я работаю над программой сокета UDP в Windows Visual Studio.
Я получаю сообщение об ошибке для оператора sprintf. Как это исправить?
Мой код:
for (i = 0; i < 30;i++) //take-off
{
printf("send AT*REF:take off\n");
sprintf(command, "AT*REF=%d,290718208\r", seq++);rc = sendto(sd, command, strlen(command) + 1, flags, (struct sockaddr *) &droneAddr, sizeof(droneAddr));
if (rc<0) {
printf("%s: can not send data\n", argv[0]);
return(1);
}
}
Я получаю следующие ошибки:
Error 1 error C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS.
Error 1 error LNK2019: unresolved external symbol __imp__bind@12
Error 2 error LNK2019: unresolved external symbol __imp__htonl@4 referenced in function _main
Error 3 error LNK2019: unresolved external symbol __imp__htons@4
Error 4 error LNK2019: unresolved external symbol __imp__sendto@24
Error 5 error LNK2019: unresolved external symbol __imp__socket@12
Error 6 error LNK2019: unresolved external symbol __imp__gethostbyname@4
Error 7 error LNK1120: 6 unresolved externals
printf
и его сестринская функция sprintf
считаются небезопасными из-за количества неопределенное поведение они излучают, если используются неправильно.
Visual Studio по умолчанию отключает эти функции.
Но, поскольку они являются частью стандартной библиотеки C ++, вы Можно используй их. Но Visual Studio позволит вам сделать это, только если вы включите строку
#define _CRT_SECURE_NO_WARNINGS
перед включением соответствующих заголовков стандартной библиотеки.
В качестве альтернативы, включить _CRT_SECURE_NO_WARNINGS
в вашем проекте настройки препроцессора (что я и делаю).
(Кстати, Visual Studio в этом случае выдает очень полезное сообщение об ошибке. Постарайтесь научиться их интерпретировать.)
Для большинства ошибок в вашем вопросе вам нужно добавить ws2_32.lib
в библиотеку, на которую ссылается проект (в проекте VS Linker | Input | Additional Dependencies
имущество).
Другие ответы / комментарии адресованы sprintf()
проблема: либо определил макрос _CRT_SECURE_NO_WARNINGS
или используйте версию sprintf()
Microsoft считает это безопасным, например, sprintf_s()
, Я бы хотел, чтобы у MSVC была стандартная версия snprintf()
это может быть использовано (может быть, скоро — они добавляют довольно много C99 в цепочку инструментов).