2017-02-03 7 views
-1

Рассмотрим следующую небольшую программу:VS2010: Функция Время() не как ожидалось

#include <time.h> 

int main(void) { 
    time_t now; 
    now = time(NULL); // This term gives an error in VS2010 

    return 0; 
} 

В Ubuntu с gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 это компилируется без ошибок.

Когда я использую выше фрагмент кода внутри проекта VS2010, проект не строится. Ошибка:

error C2064: term does not evaluate to a function taking 1 arguments 

Я также пытался использовать time() и time(&time_t). Оба отказались с error C2064. Согласно MS documentation выше использования должно быть быть правильным.

Сколько аргументов выполняет функция time() в VS2010?

+0

Компиляция с MSVC 2015 без ошибок. – Stargateur

+1

@ Начальник: Нет, по умолчанию в MSVC нет. Поведение MSVC в значительной степени аналогично поведению любого другого компилятора: язык зависит от расширения файла или может быть указан вручную. – AnT

+0

У вас есть определенная пользователем функция времени (...)? – user3853544

ответ

1

Это будет работать, но вы должны выяснить, в чем конфликт ... Это взломать.

(::time)(NULL) 

EDIT: Новая информация из оп. Это был оригинальный код:

time_t time = 0; 
time_t now; 
now = time(NULL); 

Конфликта в переменном решении имен это:

time_t myTime = 0; 
time_t now; 
now = time(NULL); 
+0

Обнаружен конфликт и добавлен в него как ответ. – nautical

0

Я нашел фактическую ошибку. Это не изначально мой проект, но я недавно начал работать над этим, чтобы добавить некоторые функции.

Как оказалось, ошибка была довольно тривиальной. После тщательного изучения исходного кода я заметил, что переменная time_t time; уже была объявлена. Когда я попытался назначить now = time(NULL);, вышеупомянутая переменная мешала вызову функции.

В этом случае сообщение об ошибке term does not evaluate to a function taking 1 arguments от VS2010 довольно отвлекает. Если аргумент опущен, он изменится на term does not evaluate to a function taking 0 arguments. Из этих сообщений я предположил, что либо другая функция с именем time() из другого включенного файла получила вызов, либо что VS2010 имеет нестандартную реализацию time().

Вызов функции - как предложено в комментариях пользователя3853544 - с now = (::time)(NULL); сигнализировал компилятору, что я ссылаюсь на функцию вместо ранее объявленной переменной. Другим решением может быть переименование нарушающей переменной, чтобы он не сталкивался с именем функции.

PS: Я воссоздал проблему и попытался скомпилировать ее на Ubuntu. Сообщение об ошибке от gcc является более информативным и точным:

$ cat sample.c 
#include <time.h> 

int main(void) { 
    time_t time = 0; 
    time_t now; 
    now = time(NULL); 

    return 0; 
} 
$ 
$ gcc sample.c 
sample.c: In function ‘main’: 
sample.c:6:8: error: called object ‘time’ is not a function or function pointer 
    now = time(NULL); 
     ^
sample.c:4:9: note: declared here 
    time_t time = 0; 
     ^
+1

И вот почему вы должны вставить свой оригинальный код :) – user3853544

+0

Мои VS2013 обозначают это как ошибку Я удивлен, что ваш не поймал его – user3853544

+0

@ user3853544 Ну, оригинальный код был слишком большой, чтобы вставить. Сообщение об ошибке отправляет мне неправильный путь. Если проект был скомпилирован с gcc, проблема была бы исправлена ​​в течение нескольких секунд :-) – nautical