gpt4 book ai didi

c - 为什么 GCC 声明 clock_gettime() 隐式声明,但预处理器对相关宏非常满意?

转载 作者:行者123 更新时间:2023-12-05 01:29:00 24 4
gpt4 key购买 nike

我正在尝试尽可能准确地测量操作所花费的时间。我的研究使我相信 clock_gettime()和 friend 是我想要的。

但是,我终生无法让它发挥作用。考虑这个看似微不足道的例子:

#include <time.h>
#include <unistd.h>

int main(void)
{
struct timespec t;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &t);
return 0;
}

如果我通过预处理器运行它,一切看起来都很好:
$ cpp time.c | tail -n10
# 1163 "/usr/include/unistd.h" 3 4

# 3 "time.c" 2

int main(void)
{
struct timespec t;
clock_gettime(2, &t);
return 0;
}

但是,如果我尝试编译预处理代码,则不会:
$ cpp time.c > time-prep.c
$ cc -o time -Wall -std=c11 -lrt time-prep.c
/tmp/user/1000/cc00SdhB.o: In function `main':
time-prep.c:(.text+0x15): undefined reference to `clock_gettime'
collect2: error: ld returned 1 exit status
$

如果我尝试编译原件,它不会变得更好:
$ cc -o time -Wall -std=c11 -lrt time.c
time.c: In function ‘main’:
time.c:6:18: error: storage size of ‘t’ isn’t known
time.c:7:2: warning: implicit declaration of function ‘clock_gettime’ [-Wimplicit-function-declaration]
time.c:7:16: error: ‘CLOCK_PROCESS_CPUTIME_ID’ undeclared (first use in this function)
time.c:7:16: note: each undeclared identifier is reported only once for each function it appears in
time.c:6:18: warning: unused variable ‘t’ [-Wunused-variable]
$

clock_gettime 的手册页说我需要

Link with -lrt (only for glibc versions before 2.17).



但正如你所看到的,我已经在这样做了。添加或删除 -lrtcc在我的情况下似乎没有任何区别。

我看过 /usr/include/time.h但没有看到任何明显我遗漏的东西。

我缺少什么(大概是微不足道的)咒语才能在我的代码中使用 clock_gettime() ?

最佳答案

clock_gettime() 的 Linux 文档指定功能测试要求:

_POSIX_C_SOURCE >= 199309L

您可以考虑直接实现这一点,也许通过 #define指令在代码的最开始,因为代码实际上依赖于它。

如果您不提供这样的 #define ,然后 gcc尽管如此,它仍然可以为您完成,具体取决于您为其指定的选项。默认情况下,它会这样做。同样与 -std=gnu99-std=gnu11 .但是你试图用 -std=c11 编译,这要求严格(ish)遵守 C11。 C11 没有定义所需的 POSIX 功能测试宏。

关于c - 为什么 GCC 声明 clock_gettime() 隐式声明,但预处理器对相关宏非常满意?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44812472/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com