"# সংজ্ঞা _জিএনইউএসএসসিআরসি" কী বোঝায়?


152

আজ আমাকে basename()ফাংশনটি ব্যবহার করতে হয়েছিল , এবং man 3 basename( এখানে ) আমাকে কিছু অদ্ভুত বার্তা দিয়েছে:

মন্তব্য

বেসনাম () এর দুটি পৃথক সংস্করণ রয়েছে - উপরে বর্ণিত পসিক্স সংস্করণ এবং জিএনইউ সংস্করণ যা পরে পাওয়া যায়

#define _GNU_SOURCE
#include <string.h>

আমি ভাবছি এর #define _GNU_SOURCEঅর্থ কী: জিএনইউ-সম্পর্কিত লাইসেন্স দিয়ে আমি যে কোডটি লিখি তা কী দাগ দিচ্ছে? বা এটি সহজভাবে " ভাল, আমি জানি, ফাংশনগুলির এই সেটটি পসিক্স নয়, এইভাবে বহনযোগ্য নয়, তবে আমি যাহাই হউক না কেন " ব্যবহার করতে চাই "এর মতো কিছু বলতে সহজভাবে ব্যবহৃত হয়েছিল ।

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

কিছু আমাকে বাগ দেয়: কম্পাইলার কীভাবে জানবে যে কার্য সম্পাদনের সাথে লিঙ্ক করতে কোন ফাংশন বাস্তবায়ন? এটিও কি এটি ব্যবহার করে #define?

কেউ আমাকে কিছু পয়েন্টার আছে?

উত্তর:


172

সংজ্ঞায়নের _GNU_SOURCEলাইসেন্সের সাথে কিছুই করার নেই এবং লেখার (অ-) পোর্টেবল কোডের সাথে সমস্ত কিছুই। আপনি যদি সংজ্ঞা দেন তবে আপনি _GNU_SOURCEপাবেন:

  1. প্রচুর নন স্ট্যান্ডার্ড জিএনইউ / লিনাক্স এক্সটেনশন ফাংশনে অ্যাক্সেস
  2. OSতিহ্যবাহী ফাংশনগুলিতে অ্যাক্সেস যা POSIX মান থেকে বাদ দেওয়া হয়েছিল (প্রায়শই ভাল কারণে, যেমন ভাল বিকল্পের সাথে প্রতিস্থাপন করা, বা নির্দিষ্ট উত্তরাধিকার বাস্তবায়নের সাথে আবদ্ধ হওয়া)
  3. নিম্ন স্তরের ফাংশন অ্যাক্সেস তাও আবার বহনযোগ্য হতে পারে না, কিন্তু যে কখনো সিস্টেম ইউটিলিটি পছন্দ বাস্তবায়নের জন্য প্রয়োজন mount, ifconfigইত্যাদি
  4. প্রচুর পসিক্স-নির্দিষ্ট ফাংশনগুলির জন্য ভাঙ্গা আচরণ, যেখানে জিএনইউ লোকেরা কীভাবে আচরণগুলি করা উচিত এবং তাদের নিজস্ব কাজটি করার সিদ্ধান্ত নিয়েছে তা স্ট্যান্ডার্ড কমিটির সাথে একমত নন।

দীর্ঘ এইসব জিনিস সচেতন আছি যেমন, এটা নির্ধারণ করতে একটি সমস্যা হওয়ার কথা নয় _GNU_SOURCE, কিন্তু আপনি সংজ্ঞা এড়িয়ে চলা উচিত এবং এর পরিবর্তে সংজ্ঞায়িত _POSIX_C_SOURCE=200809Lবা _XOPEN_SOURCE=700যখন সম্ভব তা নিশ্চিত করার জন্য আপনার প্রোগ্রাম পোর্টেবল হয়।

বিশেষত, যে জিনিসগুলি থেকে _GNU_SOURCEআপনার কখনই ব্যবহার করা উচিত নয় সেগুলি উপরে # 2 এবং # 4।


71
অবশ্যই, সবাই জানে বাস্তব সংজ্ঞায়িত করার কারণ _GNU_SOURCEঅর্ডার পেতে হয় strfryএবং memfrob
ব্যবহারকারী 4815162342

5
জিএনইউ সি লাইব্রেরি ডকুমেন্টেশনের এই লিঙ্কটি কিছু অতিরিক্ত বিশদ সরবরাহ করে (উদাহরণস্বরূপ, #define _GNU_SOURCE"কেবলমাত্র মন্তব্য দ্বারা পূর্ববর্তী ফাইলের মধ্যে প্রথম জিনিস") হিসাবে সুপারিশ করা হয়।
আলেকজান্ডার পোজডনিভ

প্রাসঙ্গিক হিসাবে নয় তবে 32 বিট লক্ষ্যবস্তুতে 2 জিবি ফাইলের আকার সীমা প্রসারিত করতে ব্যবহৃত হয়েছে।
mckenzm

1
@ এমকেনজম: আমার মনে হয় আপনি _FILE_OFFSET_BITSনা, এর কথা ভাবছেন _GNU_SOURCE
আর .. গিটহাব বন্ধ করুন সহায়তা আইসিসি

আমি স্ট্রিফ্রি মেমফ্রব এবং অন্যান্য প্ল্যাটফর্ম এবং সরঞ্জাম-চেইনের অনুরূপ সুযোগগুলির পোর্টিংয়ের জন্য অর্থপ্রদানকারী প্রোগ্রামার হতে চাই ।
ম্যাসিমো

6

আমাকে আরও দুটি পয়েন্ট উত্তর দিন:

কিছু আমাকে বাগ দেয়: কম্পাইলার কীভাবে জানবে যে কার্য সম্পাদনের সাথে লিঙ্ক করতে কোন ফাংশন বাস্তবায়ন? এটিও কি এই # নির্দিষ্ট সংজ্ঞাটি ব্যবহার করে?

একটি সাধারণ পদ্ধতির শর্তসাপেক্ষে বিভিন্ন নামের #defineশনাক্তকরণ basenameকরা _GNU_SOURCEহয়, সংজ্ঞায়িত করা হয় কিনা তার উপর নির্ভর করে । এই ক্ষেত্রে:

#ifdef _GNU_SOURCE
# define basename __basename_gnu
#else
# define basename __basename_nongnu
#endif

এখন লাইব্রেরিতে names নামগুলির মধ্যে উভয় আচরণ সরবরাহ করা দরকার।

যদি তা হয় তবে কেন একটি ফাংশন বাস্তবায়ন বা অন্যটির জন্য কিছু অস্পষ্ট পরিবেশের পরিবর্তনশীল সংজ্ঞায়নের পরিবর্তে লোককে বিভিন্ন শিরোনাম দেওয়া হয় না?

প্রায়শই একই শিরোনামটির বিভিন্ন ইউনিক্স সংস্করণে কিছুটা আলাদা বিষয়বস্তু থাকে, তাই বলে, বলার জন্য কোনও একক সঠিক সামগ্রী নেই <string.h>- এখানে অনেকগুলি মান ( xkcd ) রয়েছে। আপনার পছন্দসইটি বাছাই করার জন্য ম্যাক্রোগুলির একটি পুরো সেট রয়েছে, যাতে আপনার প্রোগ্রামটি যদি একটি মান প্রত্যাশা করে, গ্রন্থাগারটি সেই অনুসারে চলে।


6

কী দ্বারা সমস্ত সক্ষম হয়েছে তার সঠিক বিশদের জন্য _GNU_SOURCEডকুমেন্টেশন সহায়তা করতে পারে।

জিএনইউ ডকুমেন্টেশন থেকে:

ম্যাক্রো: _GNU_SOURCE

আপনি যদি এই ম্যাক্রোটি সংজ্ঞায়িত করেন তবে সবকিছু অন্তর্ভুক্ত রয়েছে: আইএসও সি 89, আইএসও সি 99, পসিএক্স 1, পসিক্স 2, বিএসডি, এসভিআইডি, এক্স / ওপেন, এলএফএস এবং জিএনইউ এক্সটেনশনগুলি। POSIX.1 BSD এর সাথে বিরোধের ক্ষেত্রে পসিক্স সংজ্ঞা অগ্রাধিকার গ্রহণ করে।

বৈশিষ্ট্য পরীক্ষা ম্যাক্রোগুলিতে লিনাক্স ম্যান পৃষ্ঠা থেকে :

_GNU_SOURCE

এই ম্যাক্রোটি (কোনও মান সহ) সংজ্ঞায়িত করে _ATFILE_SOURCE, _LARGEFILE64_SOURCE, _ISOC99_SOURCE, _XOPEN_SOURCE_EXTENDED, _POSIX_SOURCE, _POSIX_C_SOURCE কে 200809L (200112L) এর আগে ২০০.০.০৯-এর পূর্ববর্তী সংস্করণে ২০০.০৯০ এর আগে গ্লাবসি সংস্করণে; _XOPEN_SOURCE 700 মান সহ (2.10 এর আগে গ্লিবিক সংস্করণে 600; 2.2 এর আগে গ্লিবিক সংস্করণে 500)। এছাড়াও, বিভিন্ন জিএনইউ-নির্দিষ্ট এক্সটেনশনগুলিও প্রকাশিত হয়।

গ্লিবিসি ২.১৯, যেহেতু _ জিএনইউএসএসসিআরইসকে সংক্ষিপ্তভাবে _DEFAULT_SOURCE সংজ্ঞায়নের প্রভাব রয়েছে। ২.২০-এর পূর্বে গ্লিবসি সংস্করণগুলিতে, _GNU_SOURCE সংজ্ঞায়িত করার ক্ষেত্রেও স্পষ্টত _BSD_SOURCE এবং _SVID_SOURCE সংজ্ঞায়নের প্রভাব ছিল।

দ্রষ্টব্য : শিরোনাম ফাইলগুলি অন্তর্ভুক্ত করার আগে_GNU_SOURCE সংজ্ঞায়িত করা দরকার যাতে সংশ্লিষ্ট শিরোনামগুলি বৈশিষ্ট্যগুলি সক্ষম করে। উদাহরণ স্বরূপ:

#define _GNU_SOURCE

#include <stdio.h>
#include <stdlib.h>
...

_GNU_SOURCE-Dপতাকা ব্যবহার করে সংকলন প্রতি সক্ষম করা যেতে পারে :

$ gcc -D_GNU_SOURCE file.c

( -Dনির্দিষ্ট নয় _GNU_SOURCEতবে কোনও ম্যাক্রো এইভাবে সংজ্ঞায়িত করা হবে)।


4

গুগলের মাধ্যমে কিছু মেলিং তালিকা থেকে:

গ্লিবসি'র অন্তর্ভুক্ত / বৈশিষ্ট্যগুলি দেখুন:

_GNU_SOURCE উপরের সমস্তটি, আরও GNU এক্সটেনশন।

যার অর্থ এটি এগুলি সক্ষম করে:

স্ট্রিক_এএনএসআইএসআইএসআইএসআইএসএসসিএসসিআরসি , _আইএসওসিএল_এসএসসিআরসি, _পোসআইএক্স_সি_এসসিআরসি, _এক্সপেন_সেসেরস, _এক্সপেন_সেসেরস_সেইকেন্ডেড, _লার্জিএফাইল_সেসরিজ, _লার্জিএফআইএলএফএস_এসসিআরসি, _এফএসআরএফএস_স_এস, _বিএসডিএসএসসিআর

সুতরাং এটি জিসিসির জন্য পুরো প্রচুর সংকলন পতাকা সক্ষম করে


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