struct tm的替代方案

时间:2010-03-05 19:19:20

标签: c time implicit-declaration

是否存在任何其他替代数据结构而不是struct tm(分配与此结构相同的内存)?这样我就可以在不声明strftime

的情况下使用<time.h>

我知道依赖隐含声明并不好,但我在接受采访时遇到了这个问题。

编辑:准确地说,我被要求使用标准库函数打印月份以获得相应的整数,但不允许包含任何头文件。

4 个答案:

答案 0 :(得分:1)

不,您需要使用 time.h 包含文件。

但是,如果您确实想要使用 strftime 并在没有错误或警告的情况下进行编译,则可以在C文件中重新定义struct数据类型,也可以在不包含该文件的情况下重新定义要使用的函数原型。您可以将结构类型称为不同的名称,只要它与 time.h 文件中当前的名称匹配即可。

答案 1 :(得分:1)

我唯一的想法是面试官预期打印月份字符串,使用您自己的const char月份名称数组忽略语言环境,或者是那些定义不明确的“交互式”问题假设停下来并不断提问,以澄清面试官实际想要的内容。明确地,您想要表达您想知道面试官正在寻找的答案的类型。例如,只是一个简短的代码片段,忽略错误检查和区域设置或重入问题等细节,或者某些非标准嵌入式或遗留环境的答案,寻找另一个标准C库函数(ctime ??)或平台/ OS具体答案?

ObCode:

const char* months[] = { "Jan", "Feb", ..., "Dec" };
...
printf("Month: %s\n", months[i]);

或者,如果Unix / Linux系统上有一个疯狂的“横向思考者”:

char str[PATH_MAX];
...
assert(i >= 0 && i < 12);
cmd = snprintf(cmd, sizeof(cmd), "cal %d 2010 | head -1", i);
FILE* pipe = popen(cmd);
fread(str, 1, sizeof(str), pipe);
printf("Month: %s\n", str);

纯粹的坏主意。 :)

答案 2 :(得分:0)

只要您不需要访问struct tm的成员,就可以简单地使用它的前向声明:

struct tm ;

但是要使用strftime(),你还需要声明原型。你不想在他们认为这种可疑行为有用的任何地方工作。

答案 3 :(得分:0)

使用库函数需要包含头文件...

打印出一个月份名称 - 我假设您被允许stdio.h - 与您是否可以使用strftime无关。

#include <stdio.h>

const char * months[] = {
    "January",
    "February",
    "March",
    "April",
    "May",
    ...
    "December"
};

int main () {
    int i = 0;
    for (; i < 12; ++i)
        printf ("Month %d: %s\n", i + 1, months[i]);
    return 0;
}

我对你的编辑很确切。仅使用int,您可以打印与之关联的月份。但是,正如已经提到的那样,印刷本身需要包括它自己的......