2012-06-22 10 views
14

Estoy teniendo que reescribir una aplicación de C++ a C. Estoy usando gcc y Eclipse en Ubuntu 12.04. Al hacerlo me he encontrado con este errortimespec no encontrado en time.h

../src/TTNoddy.c: In function ‘main’: 
    ../src/TTNoddy.c:16:2: error: unknown type name ‘timespec’ 

Aquí es mi fragmento de código que reproduce el problema

#include <time.h> 

    int main(void) { 

     timespec TS; 
     TS.tv_nsec = 1; 

     return 0; 
    } 

Estoy confundido aquí - Soy programador de C++ y nunca escrito una aplicación C pura en mi vida, pero la página de manual para clock_gettime indica claramente que timespec se encuentra en el archivo de encabezado time.h que incluyo aquí. ¿Qué me he perdido?

Respuesta

17

timespec es un struct, necesita decirle explícitamente esto al compilador. Si lees cuidadosamente la página del manual, puedes ver que así está indicado.

Esto debería funcionar:

#include <time.h> 

int main(void) { 
    struct timespec TS; 
    TS.tv_nsec = 1; 

    return 0; 
} 

Nota adicional: Si se hubiera definido como un typedef struct, no habría necesitado añadir la parte struct manualmente. Sin embargo, se debe asumir que la mayoría de todas las estructuras puras/C no se definen como una typedef

+0

Gracias. Sabía que era una estructura, solo provenía de C++, donde funciona mi código. Nunca supe que tenía que declarar explícitamente cada timespec con struct primero. Creo que habrá muchas diferencias que voy a encontrar así. – mathematician1975

+1

También tenga en cuenta que timespec no es parte de C89/C99 sino POSIX. http://stackoverflow.com/questions/3875197/std-c99-wtf-on-linux – Morpfh

3

No debe ser solo timespec ya que timespec es una estructura. Debe ser struct timespec. Por favor modifique su código en consecuencia.

2

Tengo este error al intentar compilar un proyecto de trabajo bajo Visual Studio 2015.

La solución fue agregar HAVE_STRUCT_TIMESPEC a las definiciones del preprocesador.

A través de la interfaz gráfica de usuario: Propiedades del proyecto (PAN)> Páginas de propiedades (icono)> Configuración Propiedades> C/C++> preprocesador> Definiciones del preprocesador> Editar> Añadir HAVE_STRUCT_TIMESPEC

o manualmente: Editar cada proyecto presentar y reemplazar cada instancia de <PreprocessorDefinitions> (puede haber varios por fichero) con algo como:

<PreprocessorDefinitions>HAVE_STRUCT_TIMESPEC;WIN32;__GNU_LIBRARY__;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions> 

NB: he encontrado esta respuesta somewhere on a Github issue, así que lo estoy publicando aquí.

+1

Ver también [Error de redefinición Timespec] (http://stackoverflow.com/q/33557506) y [Timespec: struct type Error c2011 ] (http://stackoverflow.com/q/33114535). – jww