【问题标题】:VS2010: Function time() not as expectedVS2010:函数 time() 不符合预期
【发布时间】:2017-02-03 15:57:25
【问题描述】:

考虑以下小程序:

#include <time.h>

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

    return 0;
}

在带有gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 的 Ubuntu 上,这编译没有错误。

但是,当我在 VS2010 项目中使用上述代码 sn-p 时,项目不会构建。错误是:

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

我也尝试过使用time() 和time(&amp;time_t)。两者都以error C2064 失败。根据MS documentation上面的用法应该是正确的。

time() 函数在 VS2010 中实际接受了多少个参数?

【问题讨论】:

  • @Stargateur:不,MSVC 中没有“默认”。 MSVC 的行为与任何其他编译器的行为几乎相同:语言取决于文件扩展名或可以手动指定。
  • @nautical:如果您的 VS 项目中有其他代码,那么原因就在其他代码中。你一定以某种方式重新声明了time。上面的小程序在VS中编译得很好。 (不,C 不是 C++ 的子集。它是一种不同的语言。所以在一般情况下,C++ 不应该能够“处理 C”)。
  • 你说“当我在VS2010项目中使用上面的代码sn-p时......”所以不是你发布的代码导致了问题,而是你没有不发帖?
  • 试试这个 (::time)(NULL)
  • 归结为:this sn-p 编译成功与否?您没有说清楚,也没有指定确切的问题和位置。如果不是,你必须检查你的工具链,因为这是有效的代码,虽然在 C++ 项目中使用 C 头文件的风格不好,否则问题显然出在其他代码中。

标签: c++ visual-studio-2010 time


【解决方案1】:

这可行,但你应该弄清楚冲突是什么......这是一个hack。

(::time)(NULL)

编辑:来自 op 的新信息。这是原始代码:

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

变量名冲突解决办法是这样的:

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

【讨论】:

  • 发现冲突并将其添加为答案。
【解决方案2】:

我发现了实际的错误。这最初不是我的项目,但我最近开始着手添加一些功能。

事实证明,这个错误非常微不足道。再次彻底浏览源代码后,我注意到变量time_t time; 已经被声明。当我尝试分配now = time(NULL); 时,上述变量干扰了函数调用。

在这种情况下,来自 VS2010 的错误消息 term does not evaluate to a function taking 1 arguments 非常分散注意力。如果参数被省略,它将更改为term does not evaluate to a function taking 0 arguments。从这些消息中,我假设来自另一个包含文件的名为 time() 的另一个函数被调用,或者 VS2010 具有 time() 的非标准实现。

调用函数 - 正如 user3853544 在 cmets 中所建议的那样 - 使用 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;
         ^

【讨论】:

  • 这就是为什么你应该粘贴你的原始代码:)
  • 我的 VS2013 将此标记为错误,我很惊讶你没有发现它
  • @user3853544 原来的代码太大,无法粘贴。错误消息让我走错了路。如果项目是用 gcc 编译的,问题将在几秒钟内得到解决:-)
  • InteliSence:明显调用括号前的错误表达式必须具有(指向)函数类型。用红色强调准时呼叫的尝试。编译器:输出错误 C2665:'time' 2 个重载都不能转换所有参数类型。
  • @user3853544 这比 VS2010 给我的 (error C2064: term does not ...) 更精确。
猜你喜欢
  • 2014-09-22
  • 2021-10-04
  • 2012-12-28
  • 1970-01-01
  • 2012-07-19
  • 1970-01-01
  • 1970-01-01
  • 2014-10-04
  • 2019-12-06
相关资源
最近更新 更多