2012-06-22 62 views
14

我不得不將C++應用程序重寫爲C.我在Ubuntu 12.04上使用gcc和Eclipse。在這方面,我所遇到的這個錯誤timespec找不到time.h

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

這裏是我的代碼片段重現問題

#include <time.h> 

    int main(void) { 

     timespec TS; 
     TS.tv_nsec = 1; 

     return 0; 
    } 

我在這裏感到困惑 - 我是一個C++程序員,並且永遠不會寫在純C應用程序我的生活,但clock_gettime的手冊頁清楚地表明timespec是在我在這裏包括的time.h頭文件中找到的。我錯過了什麼?

回答

17

timespec是一個struct,你需要明確告訴編譯器這個。如果您仔細閱讀手冊頁,您可以看到它是如此陳述的。

這應該工作:

#include <time.h> 

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

    return 0; 
} 

附加說明:如果它已被定義爲一個typedef struct,你就不會需要手動添加struct部分。但是,你應該假設大多數/所有純C的結構沒有被定義爲typedef

+0

謝謝。我知道它是一個結構,它只是來自我的代碼工作的C++,我從來不知道你必須首先明確地聲明每個時間結構。我想會有很多不同,我會發現這樣的。 – mathematician1975

+1

另請注意,timespec不是C89/C99的一部分,而是POSIX。 http://stackoverflow.com/questions/3875197/std-c99-wtf-on-linux – Morpfh

3

它不應該只是timespec,因爲timespec是一個結構體。它應該是struct timespec。請相應地修改你的代碼。

2

努力下的Visual Studio 2015年編譯工作項目時,我得到這個錯誤。

解決方案是將HAVE_STRUCT_TIMESPEC添加到預處理器定義中。

通過GUI:項目屬性(PAN)>屬性頁(圖標)>配置屬性> C/C++>預處理>預處理定義>編輯>添加HAVE_STRUCT_TIMESPEC

或手動:編輯每個項目文件並替換的<PreprocessorDefinitions>每個實例(可以有每個文件數)的東西,如:

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

注:我發現這個答案somewhere on a Github issue,所以我在這裏發佈。

+1

另請參見[Timespec重新定義錯誤](http://stackoverflow.com/q/33557506)和[Timespec:struct type Error c2011 ](http://stackoverflow.com/q/33114535)。 – jww