سؤال

كل شيء في العنوان؛ Super-Simple أحسب، لكن من الصعب البحث عن الأشياء الأساسية في أي مكان.

هذه هي ملفان مكتبة أنا نسخ من CS50.net., ، وأنا أتساءل لماذا لديهم اثنين من ملحقات مختلفة.

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

المحلول

.c: جير ج (حيث يكون الإجراء الحقيقي، بشكل عام)

.h: ملف الرأس (المراد تضمينه مع Preprocessor #include التوجيه). يحتوي على أشياء عادة ما يتم مشاركتها مع أجزاء أخرى من التعليمات البرمجية الخاصة بك، مثل نماذج النماذج الوظيفة، # تحديد الأشياء، والإعلان الخارجي للمتغيرات العالمية (أوه، والرعب) وما شابه ذلك.

من الناحية الفنية، يمكنك وضع كل شيء في ملف واحد. برنامج ج كامل. مليون من الخطوط. لكننا البشر يميلون إلى تنظيم الأشياء. لذلك يمكنك إنشاء ملفات ج مختلفة، كل واحد يحتوي على وظائف معينة. هذا كل شيء لطيف ونظيف. ثم فجأة تدرك أن إعلان لديك في ملف C معطى يجب أن يكون موجودا أيضا في ملف ج آخر. لذلك سوف تكررها. الأفضل هو استخراج الإعلان ووضعه في ملف مشترك، وهو .h

على سبيل المثال، في CS50.H تجد ما يسمى "الإعلانات الأمامية" لوظائفك. يعد الإعلان إلى الأمام وسيلة سريعة لإخبار المحول البرمجي (يجب استدعاء الوظيفة (على سبيل المثال برامج الإدخال) وما الذي يعوده، لذلك يمكنه إجراء فحص مناسب (على سبيل المثال إذا استدعيت وظيفة مع عدد خاطئ من المعلمات، فإنه سوف يشكو).

مثال آخر. افترض أنك تكتب ملف .c الذي يحتوي على وظيفة يؤدي مطابقة التعبير العادي. تريد أن تقبل دئتك التعبير العادي والسلسلة للمطابقة، والمعلمة التي تخبر ما إذا كان يجب أن تكون المقارنة غير حساسة للحالة.

في .c سوف تضع لذلك

bool matches(string regexp, string s, int flags) { the code }

الآن، افترض أنك تريد تمرير الأعلام التالية:

0: إذا كان البحث حساس لحالة الأحرف

1: إذا كان البحث غير حساس

وتريد أن تبقي نفسك مفتوحا إلى أعلام جديدة، لذلك لم تضع شركة منطقية. اللعب مع الأرقام أمر صعب، لذلك حدد أسماء مفيدة لهذه الأعلام

#define MATCH_CASE_SENSITIVE 0
#define MATCH_CASE_INSENSITIVE 1

هذه المعلومات تدخل في .h، لأنه إذا كان أي برنامج يريد استخدام هذه الملصقات، فلن يكون هناك طريقة لمعرفةها إلا إذا قمت بتضمين المعلومات. بالطبع يمكنك وضعها في .c، ولكن بعد ذلك يجب عليك تضمين رمز .c (كله!) وهو مضيعة للوقت ومصدر للمشاكل.

نصائح أخرى

بالطبع، لا يوجد شيء يقول تمديد ملف الرأس يجب أن يكون .h وتمديد ملف المصدر C يجب أن يكون .c. وبعد هذه هي اتفاقيات مفيدة.

E:\Temp> type my.interface
#ifndef MY_INTERFACE_INCLUDED
#define MYBUFFERSIZE 8
#define MY_INTERFACE_INCLUDED
#endif

E:\Temp> type my.source
#include <stdio.h>

#include "my.interface"

int main(void) {
    char x[MYBUFFERSIZE] = {0};
    x[0] = 'a';
    puts(x);
    return 0;
}

E:\Temp> gcc -x c my.source -o my.exe

E:\Temp> my
a

إنها ليست ملفات مكتبة حقا. انهم مجرد ملفات المصدر. مثل ستيفانو قال .C. الملف هو ملف المصدر C الذي يستخدم في الواقع / يحدد المصدر الفعلي لما هو موضح فقط في .h. ملف، ملف الرأس. يحدد ملف الرأس عادة جميع النماذج والهياكل الوظيفية التي سيتم استخدامها في الملف المصدر الفعلي. فكر في الأمر مثل المرجع / الملحق. هذا واضح عند النظر إلى ملف الرأس، كما سترى :) إذن عندما تريد استخدام شيء كتب في هذه الملفات المصدر، أنت #include ملف الرأس، الذي يحتوي على المعلومات التي ستحتاج إلى معرفتها.

.c هو الملف المصدر و. h هو الملف الاساسي.

ملفات .c هي الملفات المصدر التي سيتم تجميعها. يتم استخدام ملفات .h لفضح واجهة برمجة تطبيقات البرنامج إلى جزء آخر من هذا البرنامج أو البرنامج الآخر هو إنشاء مكتبة.

على سبيل المثال، يمكن أن يكون لدى Program Pizzadelivery ملف واحد .c مع البرنامج الرئيسي، وملف واحد .c مع وظائف الأداة المساعدة. الآن، بالنسبة للجزء الرئيسي من البرنامج لتتمكن من استخدام وظائف الأداة المساعدة، تحتاج إلى فضح API، عبر النموذج الأولي في الوظيفة، في ملف .h، يتم تضمين ملف .h هذا الملف الرئيسي.

.c : 'C' source code
.h : Header file

عادة، و .c الملفات تحتوي على التنفيذ، و .h تحتوي الملفات على "واجهة" التنفيذ.

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