0
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

static struct tm createDate(unsigned day, unsigned mon, int year) {
       struct tm b = {0,0,0,day,mon-1,year-1900}; return b; 
}

static int dateExceeded(unsigned day, unsigned mon, int year) {
    struct tm b = createDate(day,mon,year); 
    time_t y = mktime(&b), now; 
    time(&now);  // error C2143: syntax error : missing ';' before 'type'
    double diff = difftime(y, now) / (60 * 60 * 24);  // error C2065: 'diff' : undeclared identifier
    return (diff < 0); 
}

static void randomEvent(){
    srand(time(NULL));
    if ( rand()%10) {
            printf("Do something here\n"); // C2143: syntax error : missing ';' before 'type'
  } 
}
4

4 回答 4

5

如果将其编译为 C89 代码,则应在块的开头声明变量。您不能double diff在块的中间声明:

static int dateExceeded(unsigned day, unsigned mon, int year) {
    double diff;
    struct tm b = createDate(day,mon,year); 
    time_t y = mktime(&b), now; 
    time(&now); 
    diff = difftime(y, now) / (60 * 60 * 24);
    return (diff < 0); 
}
于 2009-08-09T12:32:58.623 回答
0

嗯,我似乎无法重现这个。使用您的确切代码:

1>------ Build started: Project: so_1251288, Configuration: Debug Win32 ------
1>Compiling...
1>so_1251288.cpp
1>c:\users\matthew iselin\documents\visual studio 2008\projects\so_1251288\so_1251288\so_1251288.cpp(21) : warning C4244: 'argument' : conversion from 'time_t' to 'unsigned int', possible loss of data
1>Linking...
1>Build log was saved at *snip*
1>so_1251288 - 0 error(s), 1 warning(s)
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========

我假设您使用的是 Visual C++。你用的是什么版本?你的环境配置成什么?

我唯一能想到的是,您可能无意中启用了 Unicode 而不是多字节字符编码......但这不应该导致您看到的错误。

编辑:我什至无法通过创建 Visual C++ CLR 应用程序并直接粘贴您的代码来重现。我们需要更多信息才能诊断问题。

编辑 2:实际上,当我编译为 C (/TC) 而不是 C++ (/TP) 代码时,我可以重现。正如已经提到的,C89 要求在函数的开头定义变量,这会导致您的代码失败。

于 2009-08-09T12:33:36.830 回答
0

代码中也有错误。在程序的生命周期中,您应该只调用一次 srand。如果您每次在 rand() 之前调用 srand,则可能会一遍又一遍地获得相同的值。

于 2009-08-09T12:53:39.313 回答
0
ISO C90 forbids mixed declarations and code
于 2009-08-09T13:05:04.437 回答