Константы не загружены компилятором - PullRequest
9 голосов
/ 16 января 2012

Я начал изучать таймеры 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 ]

13 голосов
/ 16 января 2012

Во-первых, вы можете скомпилировать свой код с помощью -std=gnu99 вместо -std=c99, если вы хотите иметь идентификаторы SIGEV_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 объявления функции.

6 голосов
/ 16 января 2012

Если вы используете -std=c99, вы должны указать gcc, что вы все еще используете последние версии POSIX:

#define _POSIX_C_SOURCE 199309L

до любой #include или даже с -D в командной строке.

Другие ошибки:

  • Отсутствует #include <string.h>
  • Вам нужен указатель для timer_create, то есть &sigeventStruct вместопросто sigeventStruct
4 голосов
/ 16 января 2012

Другие ответы предполагают _POSIX_C_SOURCE в качестве разрешающего макроса. Это, безусловно, работает, но не обязательно включает все, что есть в спецификации Single 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. Он находится в заголовке, поэтому мне нужно изменить только один файл, когда я хочу изменить правила.

2 голосов
/ 02 мая 2012

Ссылаясь на проблему CLOCK_MONOTONIC, не определенную:

Как указал Caterpillar, это ошибка затмения, точнее ошибка CDT-Indexer с обходным решением ошибки затмения, комментарий 12

1 голос
/ 17 января 2012

Я решил много проблем с -std = gnu99 (без указания каких-либо версий POSIX), но у меня все еще есть

CLOCK_MONOTONIC could not be resolved

Поиск в интернете Я нашел несколько сообщений об ошибках в Eclipse, на которые люди жалуются. Лучше проверить, есть ли ошибка в Eclipse, потому что с

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

компилируется

...