常量未由编译器加载

时间:2012-01-16 14:47:33

标签: c posix time.h

我开始学习POSIX计时器,所以我开始做一些练习,但我立即遇到了编译器的一些问题。 在编译这段代码时,我收到一些关于像CLOCK_MONOTONIC这样的宏的奇怪消息。这些是在各种库中定义的,比如time.h等。但编译器给出了错误,好像它们没有定义一样。

这很奇怪,因为我使用的是Fedora 16,而且我的一些Ubuntu朋友得到的编译错误比我少:-O

我正在使用gcc -O0 -g3 -Wall -c -fmessage-length=0 -std=c99 -lrt

进行编译

这是我得到的错误:

  • struct sigevent sigeventStruct 提供

    storage size of ‘sigeventStruct’ isn’t known
    unused variable ‘sigeventStruct’ [-Wunused-variable]
    Type 'sigevent' could not be resolved
    unknown type name ‘sigevent’
    
  • sigeventStruct.sigev_notify = SIGEV_SIGNAL 提供

    ‘SIGEV_SIGNAL’ undeclared (first use in this function)
    request for member ‘sigev_notify’ in something not a structure or union
    Field 'sigev_notify' could not be resolved
    
  • if(timer_create(CLOCK_MONOTONIC, sigeventStruct, numero1) == -1) 提供

    implicit declaration of function ‘timer_create’ [-Wimplicit-function- declaration]
    ‘CLOCK_MONOTONIC’ undeclared (first use in this function)
    Symbol 'CLOCK_MONOTONIC' could not be resolved
    

以下是代码:

#include <stdio.h>
#include <fcntl.h>
#include <time.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <signal.h>

int main()
{
        timer_t numero1;
        struct sigevent sigeventStruct;
        sigeventStruct.sigev_notify = SIGEV_SIGNAL;
        if(timer_create(CLOCK_MONOTONIC, sigeventStruct, numero1) == -1)
        {
                printf( "Errore: %s\n", strerror( errno ) );
        }
        return 0;
}

5 个答案:

答案 0 :(得分:13)

首先,如果您希望标识符-std=gnu99-std=c99SIGEV_SIGNAL可用,则可以使用sigeventStruct代替CLOCK_MONOTONIC来编译代码。

如@adwoodland所述,当_POSIX_C_SOURCE设置为值> = 199309L时,会声明这些标识符,-std=gnu99就属于这种情况。您也可以使用-D_POSIX_C_SOURCE=199309L -std=c99或在源代码中定义宏。

其次,请参阅timer_create原型,您必须将指针作为函数的第二个和第三个参数传递:

timer_create(CLOCK_MONOTONIC, &sigeventStruct, &numero1)
                              ^                ^

此外,您还必须为string.h函数声明包含标准标题strerror

答案 1 :(得分:6)

如果您使用-std=c99,则需要告诉gcc您仍在使用最新版本的POSIX:

#define _POSIX_C_SOURCE 199309L
在任何#include之前

,甚至在命令行上使用-D

其他错误:

  • 缺少#include <string.h>
  • 您需要指向timer_create的指针,即&sigeventStruct,而不只是sigeventStruct

答案 2 :(得分:4)

其他答案建议_POSIX_C_SOURCE作为启用宏。这当然有效,但它并不一定能实现单Unix规范(SUS)中的所有内容。为此,您应该设置_XOPEN_SOURCE,这也会自动设置_POSIX_C_SOURCE。我有一个标题我称之为"posixver.h",其中包含:

/*
** Include this file before including system headers.  By default, with
** C99 support from the compiler, it requests POSIX 2001 support.  With
** C89 support only, it requests POSIX 1997 support.  Override the
** default behaviour by setting either _XOPEN_SOURCE or _POSIX_C_SOURCE.
*/

/* _XOPEN_SOURCE 700 is loosely equivalent to _POSIX_C_SOURCE 200809L */
/* _XOPEN_SOURCE 600 is loosely equivalent to _POSIX_C_SOURCE 200112L */
/* _XOPEN_SOURCE 500 is loosely equivalent to _POSIX_C_SOURCE 199506L */

#if !defined(_XOPEN_SOURCE) && !defined(_POSIX_C_SOURCE)
#if __STDC_VERSION__ >= 199901L
#define _XOPEN_SOURCE 600   /* SUS v3, POSIX 1003.1 2004 (POSIX 2001 + Corrigenda) */
#else
#define _XOPEN_SOURCE 500   /* SUS v2, POSIX 1003.1 1997 */
#endif /* __STDC_VERSION__ */
#endif /* !_XOPEN_SOURCE && !_POSIX_C_SOURCE */

它针对我使用的系统进行了调整,并不是所有人都能识别700值。如果您正在使用相对现代的Linux,我相信您可以使用700.它位于标题中,因此当我想要更改规则时,我只需要更改一个文件。

答案 3 :(得分:2)

参考CLOCK_MONOTONIC未定义的问题:

正如卡特彼勒指出这是一个日食错误,更确切地说是一个CDT-Indexer错误,其中包含eclipse bugs, comment 12的解决方法

答案 4 :(得分:1)

我用-std = gnu99(没有指定任何POSIX版本)解决了很多问题,但我仍然有

CLOCK_MONOTONIC could not be resolved

在互联网上搜索我发现了一些Eclipse错误报告,人们抱怨这个。必须更好地检查是否是Eclipse错误,因为

gcc -Wall -w -o Blala timer.c -std=gnu99 -lrt

它编译