سؤال

ولدي ملف رأس port.h، port.c، وبلدي main.c

وأحصل على الخطأ التالي: الاستخدامات "الموانئ" غير معروف البنية "port_t '

وفكرت وأنا أعلنوا البنية في ملفي .H وجود الهيكل الفعلي في ملف .C كان طيب.

وأنا بحاجة إلى إعلان الأمام كما أريد أن إخفاء بعض البيانات في ملف port.c بلدي.

في بلدي port.h لقد يلي:

/* port.h */
struct port_t;

وport.c:

/* port.c */
#include "port.h"
struct port_t
{
    unsigned int port_id;
    char name;
};

وmain.c:

/* main.c */
#include <stdio.h>
#include "port.h"

int main(void)
{
struct port_t ports;

return 0;
}

وشكرا جزيلا لأي اقتراحات،

هل كانت مفيدة؟

المحلول

ولسوء الحظ، يحتاج المترجم إلى معرفة حجم port_t (بالبايت) أثناء ترجمة main.c، لذلك كنت في حاجة إلى تعريف نوع الكامل في ملف الرأس.

نصائح أخرى

إذا كنت تريد إخفاء البيانات الداخلية للهيكل port_t يمكنك استخدام تقنية مثل كيفية تعامل المكتبة القياسية الأجسام FILE. رمز العميل يتعامل فقط مع العناصر FILE*، حتى أنها لا تحتاج (في الواقع، ثم عموما لا يمكن) لديها أي المعرفه ما هو في الواقع في بنية FILE. العيب إلى هذا الأسلوب هو أن رمز العميل لا يمكن ببساطة تعريف متغير ليكون من هذا النوع - أنها يمكن أن يكون إلا مؤشرات إلى ذلك، لذلك يحتاج الكائن المراد إنشاؤها ودمرت باستخدام بعض API، و <م> جميع الاستخدامات من وجوه يجب أن تكون من خلال بعض API.

وميزة لهذا هو أن لديك واجهة نظيفة جميلة كيفية الأجسام port_t يجب استخدامها، وتسمح لك ابقاء الامور خاصة القطاع الخاص (أشياء غير خاصة تحتاج حاصل ظائف / اضع للعميل للوصول إليها).

وتماما مثل كيف FILE I / O تتم معالجة في المكتبة C.

وثمة حل مشترك أن أستعمل:

/* port.h */
typedef struct port_t *port_p;

/* port.c */
#include "port.h"
struct port_t
{
    unsigned int port_id;
    char name;
};

ويمكنك استخدام port_p في واجهات وظيفة. سوف تحتاج إلى إنشاء malloc خاص (وحرية) مغلفة في port.h أيضا:

port_p portAlloc(/*perhaps some initialisation args */);
portFree(port_p);

وأنصح بطريقة مختلفة:

/* port.h */
#ifndef _PORT_H
#define _PORT_H
typedef struct /* Define the struct in the header */
{
    unsigned int port_id;
    char name;
}port_t;
void store_port_t(port_t);/*Prototype*/
#endif

/* port.c */
#include "port.h"
static port_t my_hidden_port; /* Here you can hide whatever you want */
void store_port_t(port_t hide_this)
{
    my_hidden_port = hide_this;
}

/* main.c */
#include <stdio.h>
#include "port.h"
int main(void)
{
    struct port_t ports;
    /* Hide the data with next function*/
    store_port_t(ports);
    return 0;
}

ومن المسلم به عموما ليس جيدا لتحديد المتغيرات في ملف الرأس.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top