এই উত্তরটি এমন একটি ক্ষেত্রে অনুপ্রাণিত হয়েছিল যেখানে অ্যানির যুক্তি সঠিক ছিল। একজন বিক্রেতা এমন একটি লাইব্রেরি লিখেছিলেন যা একবার সি এবং সি ++ উভয়কেই সমর্থন করেছিল; যাইহোক, সর্বশেষতম সংস্করণটি কেবল সিটিকে সমর্থন করেছে নিম্নলিখিত কোডগুলিতে থাকা অনুসন্ধান সংক্রান্ত নির্দেশাবলী বিভ্রান্তিকর ছিল:
#ifdef __cplusplus
extern "C" {
#endif
সি ++ এ সংকলনের চেষ্টা করে আমার বেশ কয়েক ঘন্টা ব্যয় করেছে। কেবল সি ++ থেকে সি কল করা আরও সহজ ছিল।
Ifdef __cplusplus কনভেনশন একক দায়িত্বের নীতি লঙ্ঘন করছে। এই সম্মেলনটি ব্যবহার করে একটি কোড একবারে দুটি জিনিস করার চেষ্টা করছে:
- (1) সিতে একটি ফাংশন সম্পাদন করুন - এবং -
- (২) সি ++ এ একই ফাংশনটি সম্পাদন করুন
এটি একইসাথে আমেরিকান এবং ব্রিটিশ উভয় ইংরেজিতে লেখার চেষ্টা করার মতো। এটি অযথা অবিচ্ছিন্নভাবে একটি # আইডিডিএফ __থেকেনসিভ স্প্যানার # বেল্ট __কয়েনকেন্জলিশ রেঞ্চ একটি অপব্যবহারের সরঞ্জামের মতো নিক্ষেপ করছে যা কোডটিতে # এন্ডিফ পড়তে কোডকে আরও শক্ত করে তোলে।
সাধারণ কোড এবং ছোট গ্রন্থাগারগুলির জন্য ifdef __cplusplus কনভেনশন কাজ করতে পারে; তবে জটিল লাইব্রেরিগুলির জন্য একটি ভাষা বা অন্যটি বেছে নেওয়া এবং এটির সাথে থাকা ভাল। কোনও একটিকে সমর্থন করা উভয়কে সমর্থন করার চেয়ে কম রক্ষণাবেক্ষণ করবে।
এটি উবুন্টু লিনাক্সে সংকলন করার জন্য আর্নের কোডে আমি যে পরিবর্তন করেছি সেগুলির রেকর্ড এটি।
foo.h :
#ifndef FOO_H
#define FOO_H
void foo(void);
#endif
foo.c
#include "foo.h"
#include <stdio.h>
void foo(void)
{
printf("This Hello World was called in C++ and written in C\n");
}
বার.cpp
extern "C" {
#include "foo.h"
}
int main() {
foo();
return(0);
}
মেকফিল
myfoobar: bar.o foo.o
g++ -o myfoobar foo.o bar.o
bar.o: bar.cpp
g++ -c -o bar.o bar.cpp
foo.o: foo.c
gcc -c -o foo.o foo.c
g++
ত্রুটি বার্তাগুলি লিখতে পারেন