objective c #Import এবং#মধ্যে Objective-C এর মধ্যে পার্থক্য কি?




include (8)

যদি আপনি সি ++ এবং ম্যাক্রোসের সাথে পরিচিত হন তবে

#import "Class.h" 

অনুরূপ

{
#pragma once

#include "class.h"
}

যা আপনার অ্যাপ্লিকেশন রান যখন শুধুমাত্র আপনার ক্লাস লোড হবে মানে।

উদ্দেশ্য-সি-তে অন্তর্ভুক্ত # ইমপোর্ট এবং # এর মধ্যে পার্থক্য কি এবং এমন সময় আছে যেখানে আপনি একে অপরকে ব্যবহার করতে চান? একটি অপহৃত হয়?

আমি নিম্নলিখিত টিউটোরিয়ালটি পড়ছিলাম: http://www.otierney.net/objective-c.html#preamble এবং তার অনুচ্ছেদের # ইমপোর্ট এবং # এর অন্তর্গত মনে হচ্ছে নিজের দ্বন্দ্ব বা অন্তত অস্পষ্ট।


# ইমপোর্ট নির্দেশটি উদ্দেশ্য-সি তে # উন্নত সংস্করণ হিসাবে যোগ করা হয়েছে। যাইহোক, এটি উন্নত হয়েছে কিনা তা এখনও বিতর্কের বিষয়। #import নিশ্চিত করে যে একটি ফাইল শুধুমাত্র একবার অন্তর্ভুক্ত করা হয়েছে যাতে আপনার সাথে পুনরাবৃত্তি সহ কোনো সমস্যা হয় না। যাইহোক, সবচেয়ে শালীন শিরোনাম ফাইলগুলি যেভাবেই এটির বিরুদ্ধে নিজেদের রক্ষা করে, তাই এটি আসলেই এটির একটি সুবিধা নয়।

মূলত, আপনি যা ব্যবহার করতে চান তা নির্ধারণ করার জন্য এটি আপনার উপরে। আমি উদ্দেশ্য-সি জিনিসগুলি (যেমন শ্রেণির সংজ্ঞা এবং এইরকম) এবং # আমার প্রয়োজনীয় স্ট্যান্ডার্ড সি স্টাফগুলির জন্য শিরোনাম # ইমপোর্ট করে। উদাহরণস্বরূপ, আমার উত্স ফাইলগুলির মধ্যে একটি এটির মতো দেখতে পারে:

#import <Foundation/Foundation.h>

#include <asl.h>
#include <mach/mach.h>

যদি আপনি কম্পাইলারের তুলনায় .h ফাইলগুলিতে দুইবার একটি ফাইল অন্তর্ভুক্ত করেন তবে ত্রুটি হবে। কিন্তু যদি আপনি # টি ফাইল একবার ইমপোর্ট করেন তবে কম্পাইলার এটি উপেক্ষা করবে।


আমি জানি এই থ্রেড পুরাতন ... কিন্তু "আধুনিক সময়ের" মধ্যে রয়েছে। @import এর @import মডিউলগুলির মাধ্যমে অনেক @import "কৌশল অন্তর্ভুক্ত করুন" - যা @import হয় ..

মডিউলে পাঠ্যক্রমিক প্রপ্রোপ্রাসার অন্তর্ভুক্তকরণ মডেলটিকে আরো জোরালো, আরও কার্যকর শব্দার্থিক মডেলের সাহায্যে সফ্টওয়্যার লাইব্রেরিগুলির API এ অ্যাক্সেস উন্নত করে। ব্যবহারকারীর দৃষ্টিকোণ থেকে, কোডটি কেবল সামান্য ভিন্ন দেখায়, কারন একটি # প্রিপ্রোসেসার নির্দেশিকা সহ একটি আমদানি ঘোষণা ব্যবহার করে:

@import Darwin; // Like including all of /usr/include. @see /usr/include/module.map

অথবা

@import Foundation;  //  Like #import <Foundation/Foundation.h>
@import ObjectiveC;  //  Like #import <objc/runtime.h>

যাইহোক, এই মডিউল আমদানি সংশ্লিষ্ট # অন্তর্ভূক্ত থেকে ভিন্নভাবে আচরণ করে: যখন কম্পাইলার উপরে মডিউল আমদানি দেখে, এটি মডিউলের বাইনারি প্রতিনিধিত্ব লোড করে এবং তার API সরাসরি অ্যাপ্লিকেশনে উপলব্ধ করে। পূর্ব ঘোষণাপত্রের সংজ্ঞা যা আমদানি ঘোষণা ঘোষণার আগে সরবরাহ করা API এ কোন প্রভাব ফেলে না ... কারণ মডিউলটি নিজেই পৃথক, একক মডিউল হিসাবে সংকলিত হয়েছিল। উপরন্তু, মডিউলটি ব্যবহার করার জন্য প্রয়োজনীয় কোন লিঙ্কার পতাকা স্বয়ংক্রিয়ভাবে মডিউল আমদানি করা হবে। এই সেমান্টিক আমদানি মডেল প্রিপ্রোসেস অন্তর্ভুক্তি মডেলের সমস্যার অনেক ঠিকানা।

মডিউল সক্ষম করার জন্য, কম্পাইল সময়-এ -fmodules -লাইন পতাকা -fmodules উকুন CLANG_ENABLE_MODULES এ পাস করুন। উপরে উল্লিখিত হিসাবে .. এই কৌশল কোন এবং সমস্ত LDFLAGS । যেমন, আপনি যেকোনো "লিঙ্কিং" পর্যায়গুলির পাশাপাশি "OTHER_LDFLAGS" সেটিংস পুনরুদ্ধার করতে পারেন।

আমি কম্পাইল / লঞ্চের সময়গুলিকে "অনুভব" করতে খুব বেশি অনুভব করি (অথবা সম্ভবত, "লিঙ্কিং" করার সময় কেবলমাত্র একটি বিচ্ছিন্নতা রয়েছে?)। এছাড়াও, এখন বহিরাগত প্রজেক্ট- Prefix.pch ফাইলটি খালি করার একটি দুর্দান্ত সুযোগ প্রদান করে এবং সংশ্লিষ্ট বিল্ড সেটিংস, GCC_INCREASE_PRECOMPILED_HEADER_SHARING , GCC_PRECOMPILE_PREFIX_HEADER , এবং GCC_PREFIX_HEADER ইত্যাদি।

এছাড়াও, ভাল নথিভুক্ত না হওয়া পর্যন্ত ... আপনি নিজের কাঠামোগুলির জন্য module.map তৈরি করতে পারেন এবং একই সুবিধাজনক ফ্যাশনে অন্তর্ভুক্ত করতে পারেন। এই ধরনের অলৌকিক কাজগুলি কিভাবে প্রয়োগ করা যায় তার কিছু উদাহরণের জন্য আপনি আমার ObjC-Clang-Modules github repo এ নজর রাখতে পারেন।


আমার ক্ষেত্রে হ'ল আমার হ'ল ফাইলগুলির একটিতে বৈশ্বিক পরিবর্তনশীল ছিল যা সমস্যাটি সৃষ্টি করে, এবং আমি এটির বাইরে বেরিয়ে আসার মাধ্যমে সমাধান করেছিলাম।


#include শুধু সি #include মত #include

#import কোন শিরোনামগুলি ইতোমধ্যে অন্তর্ভুক্ত করা হয়েছে তা ট্র্যাক রাখে এবং সংকলন ইউনিটতে শিরোনামটি একাধিকবার আমদানি করলে তা উপেক্ষা করা হয়। এই হেডার রক্ষীদের ব্যবহার অপ্রয়োজনীয় করে তোলে।

নিচের লাইনটি উদ্দেশ্য-সি-তে কেবলমাত্র #import ইমপোর্ট ব্যবহার করুন এবং আপনার শিরোলেখগুলি একবারের চেয়ে বেশি কিছু আমদানি করার বিষয়ে চিন্তা করবেন না।


আমি জেসন সঙ্গে একমত।

আমি এই কাজ ধরা ধরা হয়েছে:

#import <sys/time.h>  // to use gettimeofday() function
#import <time.h>      // to use time() function

GNU gcc এর জন্য, এটি অভিযোগ করে যে সময় () ফাংশন সংজ্ঞায়িত করা হয় নি।

তাই আমি # প্রতিস্থাপন # অন্তর্ভুক্ত # অন্তর্ভুক্ত এবং সব ঠিক আছে।

কারণ:

আপনি #import <sys / time.h>:
<sys / time.h> #defines ব্যবহার করে শুধুমাত্র <time.h> এর একটি অংশ অন্তর্ভুক্ত করে

আপনি # ইমপোর্ট <time.h>:
না যান। যদিও <time.h> শুধুমাত্র অংশটি ইতিমধ্যে অন্তর্ভুক্ত করা হয়েছে
যতদূর #import উদ্বিগ্ন, যে ফাইল এখন সম্পূর্ণরূপে অন্তর্ভুক্ত করা হয়।

শেষের সারি:

সি / সি ++ হেডারগুলি ঐতিহ্যগতভাবে অন্যান্য অংশগুলির মধ্যে রয়েছে ফাইল অন্তর্ভুক্ত।
সুতরাং সি / সি ++ হেডারগুলির জন্য # অন্তর্ভুক্ত করুন।
Objc / objc ++ হেডারগুলির জন্য, #import ব্যবহার করুন।


Preprocessor সম্পর্কে বিভ্রান্তির অনেক মনে হচ্ছে।

কম্পাইলারটি যখন এটি দেখায় তখন #include এটি #include যে এতে অন্তর্ভুক্ত ফাইলগুলির বিষয়বস্তু সহ সেই লাইনটি প্রতিস্থাপিত হয়, কোন প্রশ্ন জিজ্ঞাসা করা হয়নি।

সুতরাং যদি আপনার এই বিষয়বস্তু সহ একটি ফাইল আছে:

typedef int my_number;

এবং এই কন্টেন্ট সঙ্গে একটি ফাইল bc :

#include "a.h"
#include "a.h"

ফাইল bc সংকলন আগে প্রিপ্রোসেসার দ্বারা অনুবাদ করা হবে

typedef int my_number;
typedef int my_number;

যা একটি কম্পাইলার ত্রুটি হতে হবে, যেহেতু টাইপ my_number দুইবার সংজ্ঞায়িত করা হয়। সংজ্ঞাটি একই রকম হলেও সি ভাষা দ্বারা অনুমোদিত নয়।

যেহেতু একটি হেডার প্রায়ই একাধিক স্থানে ব্যবহার করা হয়, তাই গার্ড সাধারণত সি ব্যবহার করা হয়। এটি এই মত দেখাচ্ছে:

 #ifndef _a_h_included_
 #define _a_h_included_

 typedef int my_number;

 #endif

প্রি-প্রসেসেড হওয়ার পরে ফাইলটিতে bc এখনো শিরোনামের পুরো বিষয়বস্তু থাকবে। কিন্তু দ্বিতীয় উদাহরণটি উপেক্ষা করা হবে যেহেতু ম্যাক্রো _a_h_included_ ইতিমধ্যে সংজ্ঞায়িত করা হয়েছে।

এটি সত্যিই ভাল কাজ করে, কিন্তু দুটি ত্রুটি আছে। প্রথমে গার্ডগুলি লিখতে হবে, এবং ম্যাক্রো নামটি প্রতিটি শিরোনামের মধ্যে আলাদা হতে হবে। এবং দ্বিতীয়ত কম্পাইলার এখনও হেডার ফাইল সন্ধান করতে এবং এটি অন্তর্ভুক্ত করা হয় যত তাড়াতাড়ি এটি পড়তে।

উদ্দেশ্য- #import প্রপ্রোপ্রাসার নির্দেশ রয়েছে (এটি কিছু কম্পাইলার এবং বিকল্পগুলির সাথে C এবং C ++ কোডের জন্যও ব্যবহার করা যেতে পারে)। এটি প্রায় #include হিসাবে একই রকম, তবে এটি অভ্যন্তরীণভাবে নোট করে যে কোন ফাইলটি ইতিমধ্যে অন্তর্ভুক্ত করা হয়েছে। #import লাইন শুধুমাত্র নামযুক্ত ফাইলের বিষয়বস্তু দ্বারা প্রথমবার এটি প্রতিস্থাপিত হয়। প্রতিটি সময় পরে এটি উপেক্ষা করা হয়।







include