c++ - উনল - আমি সি++ সঙ্গে সুইফ্ট মিশ্রিত করতে পারেন? উদ্দেশ্য মত-সি। এমএম ফাইল




সি++ প্রোগ্রামিং বই ডাউনলোড (9)

C ++ / দ্রুত যোগাযোগের জন্য স্বয়ংক্রিয়ভাবে একটি ক্ল্যাং সরঞ্জামে আমার প্রচেষ্টা। আপনি স্নিফ্ট থেকে C ++ ক্লাসগুলি instanciate করতে পারেন, C ++ ক্লাস থেকে উত্তরাধিকার সূত্রে এবং ভার্চুয়াল পদ্ধতিগুলিকে তাত্ক্ষণিকভাবে ওভাররাইড করতে পারেন।
এটি C ++ ক্লাসটিকে প্যাসেঞ্জ করবে যা আপনি দ্রুত এক্সপোর্ট করতে চান এবং উদ্দেশ্য-সি / উদ্দেশ্য-সি ++ সেতুটি স্বয়ংক্রিয়ভাবে জেনারেট করুন।

https://github.com/sandym/swiftpp

আমি শুধু আমার। এম ফাইল .mm পরিবর্তন এবং সি ++ ব্যবহার। Swift সঙ্গে একই কাজ করার একটি উপায় আছে কি?


অন্যান্য উত্তর সামান্য ভুল। আপনি প্রকৃতপক্ষে একই ফাইলটিতে সুইফ্ট এবং [উদ্দেশ্য-] সি [++] উভয় মিশ্রণ করতে পারেন, যদিও আপনি যা আশা করবেন তা মোটেই না।

এই ফাইলটি (c.swift) উভয় swiftc c.swift এবং swiftc c.swift clang -x objective-c c.swift উভয় সাথে কার্যকর কার্যকর clang -x objective-c c.swift

/* /* */
#if 0
// */
import Foundation
print("Hello from Swift!")
/* /* */
#endif
#include <stdio.h>
int main()
{
    puts("Hello from C!");
    return 0;
}
// */


আমি একটি সহজ এক্সকোড 6 প্রজেক্ট লিখেছিলাম যা দেখায় সি ++, উদ্দেশ্য সি এবং সুইফ্ট কোডটি কীভাবে মেশানো যায়:

https://github.com/romitagl/shared/tree/master/C-ObjC-Swift/Performance_Console

বিশেষ করে উদাহরণটি সুইফ্ট থেকে একটি উদ্দেশ্য সি এবং একটি C ++ ফাংশন কল করুন।

কী একটি ভাগ করা হেডার প্রকল্প-ব্রিজিং-হেডার এইচ তৈরি করতে চাবি এবং উদ্দেশ্য সি শিরোনামগুলি সেখানে রাখুন।

একটি সম্পূর্ণ উদাহরণ হিসাবে প্রকল্প ডাউনলোড করুন।


আমি স্নিফ্ট, অবজেক্ট-সি এবং সি ++ ব্যবহার করে শুধু একটু উদাহরণ প্রকল্প তৈরি করেছি। এটি iOS এ OpenCV সেলাইয়ের ব্যবহার কীভাবে একটি ডেমো। OpenCV API সি ++ তাই আমরা সরাসরি সুইফ্ট থেকে এটি নিয়ে কথা বলতে পারছি না। আমি একটি ছোট রেপার ক্লাস ব্যবহার করি যারা বাস্তবায়ন ফাইলটি উদ্দেশ্য-সি ++। হেডার ফাইলটি পরিষ্কার উদ্দেশ্য-সি, তাই সুইফ্ট সরাসরি এই সাথে কথা বলতে পারে। সুইফ্টের সাথে ইন্টারঅ্যাক্ট করা হেডারগুলিতে যে কোনও C ++ - ISH ফাইলগুলি পরোক্ষভাবে আমদানি না করার জন্য আপনাকে সতর্ক থাকতে হবে।

প্রকল্পটি এখানে রয়েছে: https://github.com/foundry/OpenCVSwiftStitch


এক কৌতুক (অনেক) যে

আপনার bridging obj-c ++ ফাইলের জন্য আপনার একটি পৃথক শিরোনাম দরকার ...

আপনি কেবলমাত্র ইনটারফেস এবং @ ইমপ্লিমেন্টেশনটি একইভাবে নিক্ষেপ করতে পারবেন না। এমএম ফাইলটি প্রায়শই স্বাভাবিকভাবেই হয়।

তাই আপনার ব্রিজিং হেডার ফাইল আপনি আছে

#import "Linkage.hpp"

Linkage.hpp এর লিনাইজ এবং লিঙ্কেজের জন্য @ ইন্টারটারফেস রয়েছে। মি। এম। এর জন্য ইমিমেন্টেশন আছে

এবং তারপর

... আপনি আসলে Linkage.hpp এর মধ্যে # আপনার Cpp.hpp "অন্তর্ভুক্ত করবেন না

আপনি Linkage.mm ফাইলটিতে শুধুমাত্র #include "yourCpp.hpp" করুন, Linkage.hpp ফাইলটিতে নয়।

অনেক অনলাইন উদাহরণ / টিউটোরিয়ালগুলিতে, লেখক কেবলমাত্র ইনটারফেস এবং @ এমিলমেন্টেশন একই। এমএম ফাইলটি রাখেন, যেমনটি প্রায়শই হয়।

যে খুব সহজ সিপিপি ব্রিজিং উদাহরণ কাজ করবে, কিন্তু,

সমস্যা হল:

যদি আপনার আপনার Cpp.hpp এর কোনও সি ++ বৈশিষ্ট্য থাকে যা নিশ্চিতভাবে এটি (যেমন, প্রথম লাইন #include <something> ), তাহলে প্রক্রিয়াটি ব্যর্থ হবে।

তবে যদি আপনার কাছে লিঙ্কে হেডার ফাইলটিতে #include "yourCpp.hpp" না থাকে তবে এটি অবশ্যই .mm ফাইলটিতে থাকা উচিত, অবশ্যই এটি আপনার দরকার হবে) - এটি কাজ করে।

আবার দুর্ভাগ্যবশত পুরো প্রক্রিয়ার এক টিপ।


বিভ্রান্তিটি হয়তো .m.mm থেকে। .m পর্যন্ত একটি ফাইল এক্সটেনশান পরিবর্তন করে এমন ধারণা থেকে আসতে পারে, এটি .m আপনাকে ভাষাগুলিকে সেতু করতে হবে, যখন আসলে এটি এমন কিছু করে না। এটি। .mm সাথে ঘর্ষণ সৃষ্টি করে। .mm নয়, এটি হে হেডার যা ইতিবাচকভাবে একটি C++ শিরোনাম নয়।

একই প্রকল্প: হ্যাঁ।

একই প্রকল্পে, আপনি আনন্দের সাথে সি , সি ++ , উদ্দেশ্য-সি , উদ্দেশ্য সি ++ , সুইফ্ট এবং এমনকি সমাবেশটি মিশ্রিত করতে পারেন।

  1. ...Bridging-Header.h ।: আপনি এই সেতুটি ব্যবহার করে ...Bridging-Header.h জন্য সি , উদ্দেশ্য-সি এবং উদ্দেশ্য-সি ++ প্রকাশ করেন
  2. <ProductModuleName>-Swift.h : স্বয়ংক্রিয়ভাবে আপনার সুইফ্ট ক্লাসগুলি @objc Objective-C এর সাথে চিহ্নিত করে
  3. .h : এটি একটি চতুর অংশ, কারণ সেগুলি সি , ++ বা না, উদ্দেশ্য বা না সমস্ত স্বাদের জন্য ambiguously ব্যবহৃত হয়। যখন a .h একক সি ++ কীওয়ার্ড থাকে না, class মতো, এটি ...Bridging-Header.h যুক্ত করা যেতে পারে এবং এটি যেকোন .c বা .cpp কার্যকারিতাগুলি ঘোষণা করে তা প্রকাশ করবে। অন্যথায়, যে শিরোনামটি অবশ্যই একটি বিশুদ্ধ সি বা উদ্দেশ্য-সি API এ মোড়ানো হবে।

একই ফাইল: না।

একই ফাইলটিতে, আপনি সব মেশাতে পারবেন না 5. একই উৎস ফাইলটিতে :

  1. .swift : আপনি কিছু সঙ্গে সুইফট মিশ্রিত করতে পারবেন না
  2. .m : আপনি C- এর সাথে Objective-C মিশ্রিত করতে পারেন। ( @Vinzzz )
  3. .mm : আপনি C ++ সহ উদ্দেশ্য-সি মিশ্রিত করতে পারেন। এই সেতু উদ্দেশ্য-সি ++ । ( @Vinzzz )।
  4. .c : বিশুদ্ধ সি
  5. .cpp : আপনি সি ++ এবং সমাবেশ ( @Vality ) মিশ্রন করতে পারেন
  6. .h : সর্বজনীন এবং অস্পষ্ট C , C ++ , উদ্দেশ্য-সি বা উদ্দেশ্য-সি ++ , তাই উত্তর এটি নির্ভর করে।

তথ্যসূত্র

  • সি ++ ( ব্রেট হেল ) থেকে এসেম্বলিকে আমন্ত্রণ জানান
  • উদ্দেশ্য-সি ( Svitlana ) থেকে সুইফটকে আমন্ত্রণ জানান
  • SwiftArchitect থেকে সি, সি ++, ওবজ-সি, ওবজ-সি ++ কে SwiftArchitect ( SwiftArchitect , স্ব)
  • একটি সম্পূর্ণ iOS 9, SO-32541268 7 প্রকল্প ডাউনলোড করতে, সুইফ্ট রেসিপিগুলিতে SO-32541268 অনুসন্ধান করুন।

যদি এটি কারো পক্ষে সহায়ক হয়, তবে আমি একটি সহজ সি ++ স্ট্যাটিক লাইব্রেরিকে তুচ্ছ সুইফ্ট কমান্ড লাইন ইউটিলিটি থেকে কল করার সংক্ষিপ্ত সংক্ষিপ্ত টিউটোরিয়ালও নিচ্ছি। এই কোড ধারণা ধারণা টুকরা সত্যিই একটি বেয়ার-হাড় প্রমাণ।

কোন উদ্দেশ্য-সি জড়িত, শুধু সুইফ্ট এবং সি ++। একটি C ++ লাইব্রেরির কোডটি একটি C ++ র্যাপার দ্বারা বলা হয় যা বহির্মুখী "সি" সংযোগের সাথে একটি ফাংশন প্রয়োগ করে। সেই ফাংশনটি তখন ব্রিজিং হেডারে উল্লেখ করা হয় এবং সুইফ্ট থেকে বলা হয়।

দেখুন http://www.swiftprogrammer.info/swift_call_cpp.html


না। আপনি মি। থেকে .mm এ স্যুইচ করেন তখন আপনি অবজেক্ট-সি থেকে ভিন্ন ভাষাতে স্যুইচ করছেন (যার মধ্যে অনেকগুলি সূক্ষ্ম পার্থক্য রয়েছে) উদ্দেশ্য-সি ++ বলে। সুতরাং আপনি সত্যিই সি ++ ব্যবহার করছেন না; আপনি অবজেক্ট-সি ++ ব্যবহার করছেন যা ইনপুট হিসাবে সর্বাধিক C ++ গ্রহণ করে (একই ভাবে সি ++ সর্বাধিক গ্রহণ করে তবে সমস্ত সিকে ইনপুট হিসাবে গ্রহণ করে না)। যখন আমি বলি এটি বেশিরভাগ C ++ নয়, একটি C ++ ফাইলটি বিবেচনা করুন যার মধ্যে একটি নাম পরিবর্তনশীল nil (যা বৈধ C ++) রয়েছে এবং তারপরে উদ্দেশ্য-সি ++ হিসাবে কম্পাইল করার চেষ্টা করুন।

সুইফ্ট একই সম্পর্ক নেই। এটি সি বা সি ++ এর সুপারসেট নয় এবং আপনি সরাসরি .swift ফাইলেও ব্যবহার করতে পারবেন না।

"কোকো এবং উদ্দেশ্য-সি দিয়ে দ্রুত ব্যবহার করে" আমাদের বলে:

আপনি সরাসরি সুইফ্টে C ++ কোড আমদানি করতে পারবেন না। পরিবর্তে, C ++ কোডের জন্য একটি উদ্দেশ্য-সি বা সি wrapper তৈরি করুন।







swift