簡體   English   中英

我不能從中使用sizeof(struct hsearch_data) <search.h>

[英]I can't use sizeof(struct hsearch_data) from <search.h>

我正在開發一個開源項目,並且需要更改hash_table以獲得更有效的hash_table,因此,我嘗試使用標頭<search.h>

問題是,我需要覆蓋整個項目中已經在使用的功能……但是,為此,我需要使用sizeof(struct hsearch_data),但是它不起作用。

遵循代碼:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define _GNU_SOURCE
#include <search.h>
#include "hashtable.h"

#define MAX_ELEMENTS 100
#define ERROR 2
#define SUCCESS 0

hash_table *new_hash_table()
{
    hash_table *table = (hash_table *) malloc(sizeof(struct hsearch_data));
    *table = {0};   

    int status = hcreate_r(MAX_ELEMENTS, table);

    if (status == 0) {
            hdestroy_r(table);
            return NULL;
    }

    return table; 
}

PS:在頭文件中,有一個typedef struct hsearch_data hash_table;

我收到錯誤消息:

hashtable.c: In function ‘new_hash_table’:
hashtable.c:18: error: invalid application of ‘sizeof’ to incomplete type ‘struct hsearch_data’ 
hashtable.c:19: error: dereferencing pointer to incomplete type

有人可以幫我嗎?

顯然,問題在於平台上的<search.h>標頭未定義結構類型。 如對問題的評論,一個RHEL5的Linux機器上所指出的,定義“ struct hsearch_data ”當__USE_GNU定義,這是反過來,當定義_GNU_SOURCE因為你擁有它的定義。 但是,並非所有機器都是Linux。 我注意到POSIX確實定義了<search.h>標頭,但未指定要使用的結構。

您將需要跟蹤項目在何處定義結構,並確定如何使該結構可用於此代碼。 這可能很簡單-如果將結構安全地隔離在可以安全包含的標頭中。 如果定義結構的標頭還定義了您無法使用的其他內容,則可能會很復雜。

由於您要嘗試保留與原始代碼相同的接口,因此您應該以使用原始標頭來提供正確的接口定義為目標。

a測,您不應該自己使用hsearch_data ,而是使用指向hsearch_data對象的指針。 因此,標頭search.h不會公開其定義,而只是公開聲明。 然后,您將無法找到其大小。

如果為true,則該庫旨在供您使用其提供的功能,而不是通過竊取其數據類型來滾動自己的庫。

甚至以為我對hash_table仍然有麻煩,我解決了這個特定問題:

這有點愚蠢...

#define _GNU_SOURCE

必須是文件中的第一件事...我不確定為什么要這么做...但是它可以工作。

有人說了有關_USE_GNU ,此標志是在使用#define _GNU_SOURCE時設置的

我將malloc更改為calloc ,這是一個好主意!

tks。

具有_r的可重入版本是“ search.h”中哈希函數的GNU擴展。 如果查看包含文件,您會發現它們受到似乎沒有記錄的宏名__USE_GNU保護,但是您可能必須設置為正確使用它們。 特別是您的sizeof應該會起作用。

但是

  • 您的malloc不應該被強制轉換。 在C中,您不需要這樣做,可以將void*分配給任何指向對象的指針。
  • malloc的行在您編寫時不起作用。 這是初始化程序語法,不能分配。
  • 通過將hcreate_r的初始表清零,它們的含義可能是使用calloc而不是malloc
  • 如果要進行“絕對安全”的初始化擁有符合C99的編譯器(例如gcc或clang),則可以使用復合文字*table = (struct hsearch_data){0};進行以下分配*table = (struct hsearch_data){0};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM