首頁>Program>source

我覺得這可能与C語法有關,但是我是从C ++開始程式設計的,所以我不確定。

基本上我已经看到了:

struct tm t;
memset( &t, 0, sizeof(struct tm) );

我對這種語法有點困惑,因為通常我希望上面的代碼看起来像這樣:

tm t;
memset( &t, 0, sizeof(tm) );

两者之間有什麼區別,為什麼要使用前者呢?

更新

結構 tm 我指的是在 wchar.h ,其定義如下:

struct tm {
        int tm_sec;     /* seconds after the minute - [0,59] */
        int tm_min;     /* minutes after the hour - [0,59] */
        int tm_hour;    /* hours since midnight - [0,23] */
        int tm_mday;    /* day of the month - [1,31] */
        int tm_mon;     /* months since January - [0,11] */
        int tm_year;    /* years since 1900 */
        int tm_wday;    /* days since Sunday - [0,6] */
        int tm_yday;    /* days since January 1 - [0,365] */
        int tm_isdst;   /* daylight savings time flag */
        };
最新回復
  • 5月前
    1 #

    簡單的答案是 struct 存在關鍵字以限製對標識符 tm的查詢 仅限使用者定義的類型別.可能是為了与C相容而保留的。

    与其他人的說法相反,没有auto-typedef這樣的东西,C和C ++在管理使用者定義型別的標識符方面也没有區別.唯一的區別是查詢。

    您可以在此處了解更多資訊

  • 5月前
    2 #

    在C語言中,結構標記名稱不会在全域性名稱空間上形成標識符

    struct not_a_global_identifier { /* ... */ };
    

    要引用该結構,必须使用關鍵字 struct (以指定名稱空間)

    struct not_a_global_identifer object;
    

    或使用 typedef在全域性名稱空間中建立新的標識符

    typedef struct not_a_global_identifer { /* ... */ } global_name_space_identifier;
    

    C中有4个命名空間,請參阅C99標準中的6.2.3:

      label names

      the tags of structures, unions, and enumerations

      the members of structures or unions (not a single name space ... as many as structures or unions are defined)

      globalname space, for all other identifiers

    這是合法的C程式:-)

    int main(void) {
      typedef struct foobar { int foobar; } foobar;
      foobar boo;
      boo.foobar = 42;
      if (boo.foobar) goto foobar;
    foobar:
      return 0;
    }
    

  • 5月前
    3 #

    使用 struct tm t; 是為了与C相容,其中宣告了一个名為" tm"的結構 定義了一个名為" struct tm"的型別 但没有一个名為" tm"的人 "(与宣告该型別的两个名稱的C ++相反)。

  • 5月前
    4 #

    使用者定義的型別具有其自己的標識符空間,即,当編譯器解析檔案時,它將每个標識符儲存在其內部 相應的空間。

    当您提到 tm ,C編譯器(与C ++一樣)將在全域性標識符空間中搜尋该標識符.如果C ++編譯器以前没有找到符號,它將在使用者定義的型別標識符空間中查詢。

    基本上,如果您希望具有与C ++相同的行為,請添加以下行:

    typedef struct tm tm;
    

    您可以像這樣結合使用struct宣告和typedef:

    typedef struct tm { int field } tm;
    

    或使用匿名結構:

    typedef struct { int field } tm;
    

    相同的行為適用於 enumunion

    typedef enum { VALUE } myEnum;
    typedef union { int integer; char charArray[4]; } myUnion;
    

  • 5月前
    5 #

    在您的示例中,tm可能是型別轉換結構.

    例如

    typedef struct tm_t
    {
      int x; 
    }tm;
    

    然後您就可以

    tm t;
    

  • jquery:錯誤:語法錯誤:錯誤的令牌<
  • c#:並行執行任務