আমি কি সুইফটকে সি ++ এর সাথে মিশতে পারি? অবজেক্টিভ-সি। মিমি ফাইলগুলি পছন্দ করুন


131

আমি সবেমাত্র আমার .m ফাইলগুলিকে .mm এ পরিবর্তন করেছি এবং সি ++ ব্যবহার করি। সুইফ্টের সাথে কি একইভাবে করার উপায় আছে?

উত্তর:


111

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

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

"সুইচ উইথ কোকো এবং অবজেক্টিভ-সি" ব্যবহার আমাদেরও বলে:

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


93
আসলেই খুব বিরক্তিকর - সি / সি ++ কোড ঘাঁটি সমন্বিত কোকো অ্যাপ্লিকেশন সহ আমাদের সকলকে এখন 3 টি ভাষায় লিখিত প্রকল্পগুলি বজায় রাখতে হবে ....
জে

6
আমি প্রস্তাব দিচ্ছি যে অবজেক্টিভ-সি ++ আলাদা ভাষা নয় তবে সি ++ এবং উদ্দেশ্য-সি পার্থক্যের মিশ্রণটি সূক্ষ্ম তবে এটি এখনও রয়েছে
amar

1
কীভাবে "শূন্য" আইনী সি ++? যেমন জিনিস (অন্তত মান C ++) অন্য একটি উদাহরণ প্রদান করুন এর
rewolf

3
তবে ওবজিসি দিয়ে আপনি কেবল .mmনিজের ফাইলগুলিতে যেতে পারেন (প্রায়) সম্পন্ন করে নিতে পারেন। সুইফ্টের সাথে তেমন নয়।
চকৃত

6
@ ওলুফ, আমার মনে হয় তার নামের অর্থ একটি পরিবর্তনশীল nil, যেমনint nil
লুক

165

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


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

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

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

একই ফাইল: না

ইন একই ফাইল, আপনি মিশ্রিত করা যাবে না সব 5. একই সালে সোর্স ফাইল :

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

তথ্যসূত্র


1
সংশোধন: একই। মি উত্স ফাইলে, উদ্দেশ্য-সি একটি কঠোর সি সুপারসেট
হওয়ায়

1
সমস্যা নেই, আমি ক্রেডিটটিরও যত্ন নেই, যতক্ষণ না উত্তরটি সঠিক হয়;) বিটিডাব্লু,। মিমি উদ্দেশ্য -সি এবং সি ++ (সি এবং সি ++ ) মিশ্রনের জন্য , নাম সত্ত্বেও দুটি আলাদা জিনিস )
Vinzzz

1
আমি উল্লেখ করব যে অবজেক্টিভ সি এর বিপরীতে, সি ++ একটি সি সুপারসেট নয় তাই আপনি .cpp ফাইলে সি এবং সি ++ উভয়ই মিশ্রণ করতে পারবেন না। কেবল সি ++ এবং সমাবেশ।
মান 10

1
যদি কেউ দেখতে পান যে সুইফট ফাইলগুলিকে তাদের উদ্দেশ্য-সি / সি ++ ফাইলে প্রকাশ করার চেষ্টা করার সময় এই ভাল উত্তরটি যথেষ্ট সাহায্য করে না (এক্সকোড অভিযোগ করছে যে সুইফট শিরোনামের ফাইলটি খুঁজে পাওয়া যায় নি)। আমি দেখতে পেয়েছি যে আমাকে আমার উদ্দেশ্য-সি / সি ++ উত্স ফাইলটিতে "ProductName / ProductModuleName-Swift.h" আমদানি করতে হয়েছিল । আমি এটিকে কিছুটা সমাহিত অবস্থায় দেখতে পেয়েছি: বিকাশকারী
অ্যাপ্লিকেশন

ভাল যুক্তি. এই ভাষাগুলির মিশ্রণকারী কোনও কাজের প্রকল্পের জন্য, stackoverflow.com/a/32546879/218152 এ দেখুন ।
সুইফটআর্কিটেক্ট

72

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

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

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

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

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


এই জিয়ান জন্য ধন্যবাদ!
জেসন এলউড

এই উদাহরণের জন্য আপনাকে ধন্যবাদ, তবে আমি যদি # ইম্পোর্ট "সিপ্লাসপ্লাস.হ" কে ওবজক্টোসিপ্লাসপ্লাস.এমএম থেকে ওবজক্টোসিপ্লাসপ্লাস.চ ফাইলটিতে স্থানান্তর করতে চাই, সংকলক এই ত্রুটিটি ফিরিয়ে আনবে: <অজ্ঞাত>: 0: ত্রুটি: ব্রিজিং শিরোনাম আমদানি করতে ব্যর্থ হয়েছে ' / ব্যবহারকারী / আলে/ডাউনলোডস / শেয়ার্ড- মাস্টার / সি- ওবিজেসি- সুইফট / পারফরম্যান্স_কনসোল / পারফরম্যান্স_কনসোল / পারফরম্যান্স_কনসোল- ব্রিডিং- হেডার এইচ। 'এই ইম্পোর্টটি কি শিরোনাম ফাইলটিতে স্থানান্তরিত করা সম্ভব?
আলেসান্দ্রো পিরোভানো

@ এপিআই: না, আপনি পয়েন্টটি মিস করছেন। ObjCtoCPlusPlus.h/ `to .mm` সি ++ কোডে একটি ওব-সি ইন্টারফেস সরবরাহের একমাত্র উদ্দেশ্যে উপস্থিত রয়েছে — এটি সেতুটি, যা এখানে প্রয়োজনীয় উপাদান। যেখানে রয়েছে সেগুলি অন্তর্ভুক্ত করুন ObjCtoCPlusPlus.…এবং প্রতিটি সি ++ পদ্ধতির জন্য আপনার অ্যাক্সেসের প্রয়োজন ফাইলে একটি পদ্ধতি যুক্ত করুন । সোর্স মেকিং
স্লিপ ডি থম্পসন

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

31

এর মধ্যে আপনি ওজেক্টিভ-সি ফাইলটি এড়িয়ে যেতে পারেন । একটি .cpp উত্স ফাইল সহ একটি সি হেডার ফাইল যুক্ত করুন। হেডার ফাইলটিতে কেবল সি ঘোষণা রয়েছে এবং উত্স ফাইলে যে কোনও সি ++ কোড অন্তর্ভুক্ত রয়েছে। তারপরে ** - ব্রিজিং-শিরোনামে সি হেডার ফাইল অন্তর্ভুক্ত করুন।

নিম্নলিখিত উদাহরণটি সি ++ অবজেক্টে (স্ট্রাক্ট ফু) একটি পয়েন্টার দেয় যাতে সুইফট বিশ্বজুড়ে স্ট্রাক্ট ফু সংজ্ঞায়নের পরিবর্তে একটি সিপেকপয়েন্টারে সংরক্ষণ করতে পারে।

Foo.h ফাইল (সুইফ্ট দ্বারা দেখা - ব্রিজিং ফাইলের মধ্যে অন্তর্ভুক্ত)

#ifndef FOO_H
#define FOO_H

// Strictly C code here.
// 'struct Foo' is opaque (the compiler has no info about it except that 
// it's a struct we store addresses (pointers) to it.
struct Foo* foo_create();
void foo_destroy(struct Foo* foo);

#endif

ভিতরে উত্স ফাইল Foo.cpp (সুইফ্ট দ্বারা দেখা যায় না):

extern "C"
{
#include "Foo.h"
}
#include <vector>

using namespace std;

// C++ code is fine here. Can add methods, constructors, destructors, C++ data members, etc.
struct Foo
{
   vector<int> data;
};

struct Foo* foo_create()
{
   return new Foo;
}

void foo_destroy(struct Foo* foo)
{
    delete foo;
}

1
এই উত্তরটি দাবী পথ আরো upvotes। সত্যিই দরকারী।
RSSp1984

এই প্রথমবারের মতো আমি শিরোনামের ফাইলটিতে নিজেই সম্পাদনার extern "C"পরিবর্তে #ifdefশিরোনামটি অন্তর্ভুক্ত করা জায়গায় মোড়ানো দেখেছি । উজ্জ্বল!
ডিসকো

27

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

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


আমি মনে করি এটি সুইফটের সাথে একটি তৃতীয় পক্ষের লাইব্রেরি KudanCV ব্যবহার করার চেষ্টা করে আমি যে সমস্যার মুখোমুখি হয়েছি তার উত্তর দেয়। আমার ব্রিজিং শিরোনাম তাদের। এইচ ফাইলটি আমদানি করে যার মধ্যে <memory> <strings> এবং <vectors> আমদানি রয়েছে যা আমি অনুমান করি যে সি ++ লাইব্রেরি বা ফাইলগুলি, ফলস্বরূপ আমার সুইফ্ট কোডটি সংকলন করবে না। এর আশেপাশে কোনও উপায় আছে কিনা যদি কেউ আমাকে বলতে পারে তবে আমি কৃতজ্ঞ হব - বা যদি আমার সমস্ত কোডটি উদ্দেশ্য-সি
রকেট করতে হয়

1
@ রকেটগার্ডেন - কুডানসিভি শিরোনাম ফাইলটি সি ++। আপনি এমন একটি মোড়ক লিখতে পারেন যা আমার উদাহরণের মোড়কের ক্লাসের মতো কাজ করে। অথবা আপনি আপনার অ্যাপ্লিকেশনটির সেই অংশগুলি পুনরায় লিখুন যা উদ্দেশ্য-সি ++ (একটি উদ্দেশ্য-সি শিরোলেখ সহ) কুদানসিভিতে কথা বলতে হবে। আপনার প্রকল্পের সেই অংশগুলিকে পুনরায় লেখার দরকার নেই যা কুদানসিভির সাথে সম্পর্কিত নয়।
ফাউন্ড্রি

এর জন্য ধন্যবাদ, আমি এটি প্রায় 5 মিনিট পরে বুঝতে পেরেছিলাম, তবে এটি অন্যের জন্য রেকর্ডে রাখার জন্য এটি দরকারী।
রকেট গার্ডেন

13

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

https://github.com/sandym/swiftpp


8

সুইফট সরাসরি সি ++ এর সাথে সামঞ্জস্য নয়। আপনি আপনার সি ++ কোডটি অবজেক্টিভ-সি দিয়ে মোড়ানো এবং সুইফটে অবজেক্টিভ সি র‍্যাপার ব্যবহার করে ইস্যুটি নিয়ে কাজ করতে পারেন।


এটাই আমি করেছি। আমি কীভাবে সুইফট প্রকল্পের সাথে সি ++ সংহত করতে হবে তার উপর একটি নিবন্ধ লিখেছিলাম: learningswift.brightdigit.com/integrating-c-plus-plus-swift
লিওগডিয়ন 16'19


4

না, একক ফাইলে নয়।

তবে, আপনি স্ট্যাটিক লাইব্রেরি বা কাঠামোর প্রয়োজন ছাড়াই সুইফ্ট প্রকল্পগুলিতে সি ++ ব্যবহার করতে পারেন। অন্যরা যেমন বলেছেন, মূলত হ'ল একটি উদ্দেশ্য-সি ব্রিজিং শিরোনাম যা # বহিরাগত "সি" {} ট্রিকের সাথে সি হিসাবে সামঞ্জস্যপূর্ণ সি + সামঞ্জস্যপূর্ণ সি ++ শিরোনাম অন্তর্ভুক্ত করে।

ভিডিও টিউটোরিয়াল: https://www.youtube.com/watch?v=0x6JbiphNS4


2

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

এই ফাইলটি (সি। সুইফট) উভয় swiftc 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;
}
// */

আপনার নমুনা কোডটি সি ++ তে নয়। <iostream> উদাহরণ আইএমএইচও সহ আরও ভাল।
kakyo

2

একটি কৌশল (অনেকের) হ'ল তা

আপনার ব্রিজিং আপত্তি-সি ++ ফাইলের জন্য আপনার একটি পৃথক শিরোনাম প্রয়োজন ...

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

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

#import "Linkage.hpp"

Linkage.hpp এর লিঙ্কেজের জন্য @ অভ্যন্তরীণ পৃষ্ঠ রয়েছে এবং লিংকেজ.এমএম। এমএম এর @ বাস্তবায়ন রয়েছে

এবং তারপর

... আপনি লিংকেজ এইচপি-তে আসলে "আপনার সিপিপিপিপি" অন্তর্ভুক্ত করবেন না

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

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

এটি খুব সাধারণ সিপিপি ব্রিজিং উদাহরণগুলিতে কাজ করবে, কিন্তু,

সমস্যা হল:

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

কিন্তু আপনি শুধু না আছে #include "yourCpp.hpp"লিঙ্কেজ মধ্যে হেডার ফাইল (এটা জরিমানা .mm ফাইলে এটা আছে অবশ্যই আপনি করতে হবে) - এটি কাজ করে।

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


1

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

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

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


1

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

আজকের স্থিতিটি হ'ল এটি বৈশিষ্ট্যটির অনুরোধ যা গ্রহণ করা হয়েছে তবে এখনও নির্ধারিত হয়নি।

এই লিঙ্কটি সঠিক দিক দিয়ে এই বৈশিষ্ট্যটির জন্য যে কেউ খুঁজছেন তা চালিত করার উদ্দেশ্যে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.