[英]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
*table = (struct hsearch_data){0};
進行以下分配*table = (struct hsearch_data){0};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.