2015-08-04 3 views
0

Я пытаюсь скомпилировать очень простой код C в VS2013. Я сделал немного Googling заранее, и я понял, что мне нужно выполнить определенные шаги для этого, например. измените компилятор с Default на Compile As C Code в моих свойствах проекта.Скомпилировать простой код C в Visual Studio 2013

Проблема заключается в том, что, когда я скомпилировать следующий код:

#include <stdio.h> 
main() 
{ 
    printf("Hello World! \n"); 
    sleep(5); 
} 

я получаю эти ошибки:

Error 1 error LNK2019: unresolved external symbol _sleep referenced in function _main 
Error 2 error LNK1120: 1 unresolved externals 

И если изменить код:

#include <stdio.h> 
#include <Windows.h> 
main() 
{ 
    printf("Hello World! \n"); 
    Sleep(5000); 
} 

Тогда он работает отлично.

Как я могу скомпилировать свой первый код? У меня есть некоторые проверенные коды на C, и мне нужно их использовать. Если я не смог решить проблему выше, тогда мне нужно обновить все синтаксисы.

ответ

2

Как я могу скомпилировать свой первый код?

Вы не можете (по крайней мере, с этим кодом, как вы указали). Дело в том, что заголовок <stdio.h> не предоставляет декларации для sleep(), а для стандарта C требуется, чтобы каждая функция должна была быть объявлена ​​перед ее вызовом. Это так просто.

Вторая вещь, что sleep() функция, которую вы хотите, скорее всего от POSIX (в частности от <unistd.h> заголовка). Однако Visual Studio 2013 является не POSIX-совместимый. Таким образом, решение заключается в использовании Sleep(), который объявлен в заголовке <Windows.h> или, возможно, в качестве альтернативы.

1

sleep не является стандартной функцией:

  • В UNIX использует <unistd.h>
  • В MS-Windows использует <windows.h>

Там нет никакого способа обойти это, кроме написания вашего собственного кода:

void sleep (int seconds) 
{ 
    Sleep (seconds * 1000); // Converting to milliseconds 
} 
+0

Для старшего MSVC это будет '#include ' – wallyk

+0

Спасибо за ответ. Я запускаю свой код на платформе Windows. Мне все еще нужен этот заголовок? Я думал, что это необходимо только на платформах Unix. Хотя, я получаю эту ошибку сейчас: 'Ошибка ошибка C1083: Не могу открыть файл include: 'unistd.h': Нет такого файла или каталога' – Bababarghi

+0

@cpp_prog Правильно ли вы прочитали мой вопрос? Я уже упоминал об этом! Добавление 'Windows.h' требует, чтобы я заменил' sleep (5) 'на' Sleep (5000) '. Вся нить вот-вот найдет обходное решение, чтобы не следовать этому пути! – Bababarghi

2

Sleep не является стандартной функцией C.

Если вы находитесь в системе UNIX, укажите <unistd.h>. Однако, если вы находитесь на окна системы, она должна быть в <windows.h> (почему ваша вторая версия кода успешно компилируется

Если вы хотите использовать в обеих системах, попробовать что-то вроде этого (от here).:

#ifdef __linux__ 
    //linux include code goes here 
#elif _WIN32 
    // windows include code goes here 
#else 

#endif 
1

функция сна не объявлена ​​в <stdio.h>. Если вы на Unix, используйте sleep() из unistd.h, или для окон, Sleep() от WinBase.h (windows.h).Если вы хотите увидеть, как работает Sleep(), вы можете увидеть how is sleep implemented at OS level?.

Если вы хотите сделать это без того, чтобы изменить sleep() к Sleep(), вы можете использовать макрос:

#define sleep(s) Sleep((s) * 1000)

Макросы плохо, так что вы не можете сделать это в рабочем коде, но преимущество макроса заключается в том, что он будет гарантированно быть встроенным, что приведет к более быстрому коду.

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