সেগমেন্টেড হেডার

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

আপনাকে জানতে হবে কি

  • J2ObjC জেনারেটেড হেডার অন্তর্ভুক্ত করতে #import এর পরিবর্তে #include ব্যবহার করুন।
    • সেগমেন্টেড হেডারের সাথে #import ব্যবহার করা সমস্যাযুক্ত কারণ কম্পাইলার হেডার পড়া এড়িয়ে যাবে যদি এটি ইতিমধ্যেই দেখে থাকে। কিন্তু, হেডারটি সেগমেন্টেড হওয়ার কারণে এটি প্রথমবার কম্পাইলার দ্বারা সম্পূর্ণ পার্স করা নাও হতে পারে।
  • সেগমেন্টেড হেডারগুলি --no-segmented-headers পতাকা দিয়ে নিষ্ক্রিয় করা যেতে পারে।

সার্কুলার অন্তর্ভুক্ত

J2ObjC জেনারেট করা হেডার ফাইলগুলিকে অবশ্যই অন্তর্ভুক্ত এবং ফরওয়ার্ড ঘোষণা ব্যবহার করতে হবে প্রয়োজনীয় ধরনের তথ্য সমাধান করতে। ফরোয়ার্ড ঘোষণাগুলি যতটা সম্ভব ব্যবহার করা হয়, তবে অন্তর্ভুক্তগুলি প্রসারিত বা বাস্তবায়নের জন্য প্রয়োজনীয় কারণ কম্পাইলারের সম্পূর্ণ প্রকারের ঘোষণার প্রয়োজন হয়।

J2ObjC জেনারেটেড হেডার ফাইলগুলিতে অন্তর্ভুক্ত চক্র তৈরি করা সম্ভব। এই ধরনের একটি চক্র পেতে আমাদের ফাইল A-তে একটি ক্লাস প্রয়োজন যা ফাইল B-এ একটি শ্রেণী প্রসারিত করে এবং B-এ একটি শ্রেণী যা ফাইল A-তে একটি শ্রেণী প্রসারিত করে। এটি একটি অসম্ভাব্য দৃশ্য, কিন্তু এটি পেয়ারার কোডবেসে (এবং অন্য কোথাও) ঘটে )

এই সমস্যার একটি স্বাভাবিক সমাধান হতে পারে একটি .java ফাইলে সম্মুখীন প্রতিটি জাভা টাইপের জন্য একটি পৃথক হেডার ফাইল নির্গত করা। কিন্তু J2ObjC একটি বিল্ড টুল হিসাবে ব্যবহার করার জন্য ডিজাইন করা হয়েছে এবং যেকোনো ভাল বিল্ড সিস্টেম প্রতিটি ইনপুটের জন্য অনুমানযোগ্য আউটপুটের উপর নির্ভর করে। মানে প্রতিটি .java ফাইলের জন্য একটি .h এবং একটি .m ফাইল তৈরি করা আবশ্যক৷

উদাহরণ

Foo.java:

class Foo extends Bar {}

বার.জাভা:

class Bar {
  static class Baz extends Foo {}
}

Foo.h (বিভাগ করা হয়নি):

#ifndef _Foo_H_
#define _Foo_H_

#include "Bar.h"
#include "J2ObjC_header.h"

@interface Foo : Bar
- (instancetype)init;
@end

#endif // _Foo_H_

Bar.h (বিভাগ করা হয়নি):

#ifndef _Bar_H_
#define _Bar_H_

#include "Foo.h"
#include "J2ObjC_header.h"

@interface Bar : NSObject
- (instancetype)init;
@end

@interface Bar_Baz : Foo
- (instancetype)init;
@end

#endif // _Bar_H_

লক্ষ্য করুন যে Foo.h-এর মধ্যে Bar.h এবং Bar.h-এর মধ্যে Foo.h অন্তর্ভুক্ত রয়েছে। ফলস্বরূপ এই শিরোনামগুলি কম্পাইল করতে ব্যর্থ হয়:

../dist/j2objcc -c Foo.m
In file included from Foo.m:6:
In file included from ./Bar.h:9:
./Foo.h:12:18: error: cannot find interface declaration for 'Bar', superclass of 'Foo'
@interface Foo : Bar
~~~~~~~~~~~~~~   ^

নিচে Foo.h এবং Bar.h-এর সেগমেন্টেড ভার্সন রয়েছে, যেগুলো কোনো ত্রুটি ছাড়াই কম্পাইল করবে।

Foo.h (বিভাগ করা):

#include "J2ObjC_header.h"

#pragma push_macro("Foo_INCLUDE_ALL")
#if Foo_RESTRICT
#define Foo_INCLUDE_ALL 0
#else
#define Foo_INCLUDE_ALL 1
#endif
#undef Foo_RESTRICT

#if !defined (_Foo_) && (Foo_INCLUDE_ALL || Foo_INCLUDE)
#define _Foo_

#define Bar_RESTRICT 1
#define Bar_INCLUDE 1
#include "Bar.h"

@interface Foo : Bar
- (instancetype)init;
@end

#endif

#pragma pop_macro("Foo_INCLUDE_ALL")

Bar.h (খণ্ডিত):

#include "J2ObjC_header.h"

#pragma push_macro("Bar_INCLUDE_ALL")
#if Bar_RESTRICT
#define Bar_INCLUDE_ALL 0
#else
#define Bar_INCLUDE_ALL 1
#endif
#undef Bar_RESTRICT

#if !defined (_Bar_) && (Bar_INCLUDE_ALL || Bar_INCLUDE)
#define _Bar_

@interface Bar : NSObject
- (instancetype)init;
@end

#endif

#if !defined (_Bar_Baz_) && (Bar_INCLUDE_ALL || Bar_Baz_INCLUDE)
#define _Bar_Baz_

#define Foo_RESTRICT 1
#define Foo_INCLUDE 1
#include "Foo.h"

@interface Bar_Baz : Foo
- (instancetype)init;
@end

#endif

#pragma pop_macro("Bar_INCLUDE_ALL")