উত্তর:
হ্যাঁ, -E -dM
-c এর পরিবর্তে বিকল্পগুলি ব্যবহার করুন। উদাহরণ (তাদের স্টাটআউট আউটপুট):
gcc -dM -E - < /dev/null
সি ++ এর জন্য
g++ -dM -E -x c++ - < /dev/null
থেকে জিসিসি ম্যানুয়াল :
সাধারণ আউটপুট পরিবর্তে, পূর্বনির্ধারিত ম্যাক্রোগুলি সহ প্রিপ্রসেসর কার্যকর করার সময় সংজ্ঞায়িত সমস্ত ম্যাক্রোগুলির জন্য `# ডেফাইন 'নির্দেশের একটি তালিকা তৈরি করুন। এটি আপনাকে প্রিপ্রসেসর এর সংস্করণে পূর্বনির্ধারিত কী তা সন্ধান করার একটি উপায় দেয়। ধরে নিচ্ছি আপনার কোনও ফাইল foo.h নেই, কমান্ড
touch foo.h; cpp -dM foo.h
সমস্ত পূর্বনির্ধারিত ম্যাক্রোগুলি প্রদর্শন করবে।
আপনি যদি -E বিকল্প ব্যতীত -dM ব্যবহার করেন, -dM -fdump-rtl-mach এর প্রতিশব্দ হিসাবে ব্যাখ্যা করা হয়।
echo | gcc -dM -E -
উইন্ডোতেও কাজ করে।
cpp -dM -E - < NUL
ব্যবহার করা যেতে পারে।
আমি সাধারণত এটি এইভাবে করি:
$ gcc -dM -E - < /dev/null
নোট করুন যে কিছু প্রিপ্রোসেসর সংজ্ঞায়িত কমান্ড লাইন বিকল্পের উপর নির্ভরশীল - আপনি উপরের কমান্ড লাইনের সাথে সম্পর্কিত বিকল্পগুলি যুক্ত করে এটি পরীক্ষা করতে পারেন। উদাহরণস্বরূপ, কোন এসএসই 3 / এসএসই 4 অপশন ডিফল্টরূপে সক্ষম হয়েছে তা দেখতে:
$ gcc -dM -E - < /dev/null | grep SSE[34]
#define __SSE3__ 1
#define __SSSE3__ 1
এবং তারপরে -msse4
নির্দিষ্ট করা হলে এটি তুলনা করুন :
$ gcc -dM -E -msse4 - < /dev/null | grep SSE[34]
#define __SSE3__ 1
#define __SSE4_1__ 1
#define __SSE4_2__ 1
#define __SSSE3__ 1
একইভাবে আপনি কমান্ড লাইন অপশনগুলির দুটি পৃথক সেটগুলির মধ্যে পৃথক কোন বিকল্পগুলি দেখতে পাবেন, যেমন অপ্টিমাইজেশন স্তরগুলির -O0
( কোনওটি নয়) এবং -O3
(পূর্ণ) জন্য প্রিপ্রেসেসর সংজ্ঞায়িত তুলনা করুন :
$ gcc -dM -E -O0 - < /dev/null > /tmp/O0.txt
$ gcc -dM -E -O3 - < /dev/null > /tmp/O3.txt
$ sdiff -s /tmp/O0.txt /tmp/O3.txt
#define __NO_INLINE__ 1 <
> #define __OPTIMIZE__ 1
দেরীতে উত্তর - আমি অন্যান্য উত্তরগুলি দরকারী বলে খুঁজে পেয়েছি - এবং কিছুটা অতিরিক্ত যুক্ত করতে চেয়েছিলাম।
আমি একটি নির্দিষ্ট শিরোলেখ ফাইল থেকে আগত প্রিপ্রসেসর ম্যাক্রোগুলি কীভাবে ডাম্প করব?
echo "#include <sys/socket.h>" | gcc -E -dM -
বা (পরামর্শের জন্য @ মাইমিডিয়াকে ধন্যবাদ):
gcc -E -dM -include sys/socket.h - < /dev/null
বিশেষত, আমি দেখতে চেয়েছিলাম আমার সিস্টেমে সোম্যাকসন কী সংজ্ঞায়িত হয়েছিল। আমি জানি যে আমি কেবলমাত্র স্ট্যান্ডার্ড শিরোনাম ফাইলটি খুলতে পারি, তবে কখনও কখনও হেডার ফাইলের অবস্থানগুলি খুঁজতে আমাকে কিছুটা অনুসন্ধান করতে হয়। পরিবর্তে আমি কেবল এই ওয়ান-লাইনারটি ব্যবহার করতে পারি:
$ gcc -E -dM -include sys/socket.h - < /dev/null | grep SOMAXCONN
#define SOMAXCONN 128
$
সাধারণ পদ্ধতির ( gcc -dM -E - < /dev/null
) জিসিসির জন্য দুর্দান্ত কাজ করে তবে জি ++ এর জন্য ব্যর্থ হয়। সম্প্রতি আমার সি ++ 11 / সি ++ 14 বৈশিষ্ট্যের জন্য একটি পরীক্ষা প্রয়োজন। তাদের সম্পর্কিত ম্যাক্রো নামগুলির জন্য প্রস্তাবনাগুলি https://isocpp.org/std/standing-documents/sd-6-sg10-feature-test-re सिफारिशগুলিতে প্রকাশিত হয় । কিন্তু:
g++ -dM -E - < /dev/null | fgrep __cpp_alias_templates
সর্বদা ব্যর্থ হয়, কারণ এটি নিঃশব্দে সি-ড্রাইভারদেরকে আহ্বান করে (যেন তাদের দ্বারা আহবান করা হয়েছে gcc
)। আপনি এটির ফলাফলকে জিসিসির সাথে তুলনা করে বা একটি জি ++ - নির্দিষ্ট কমান্ড লাইন বিকল্প (-std = c ++ 11) যুক্ত করে ত্রুটি বার্তাটি প্রকাশ করে এটি দেখতে পাচ্ছেন cc1: warning: command line option ‘-std=c++11’ is valid for C++/ObjC++ but not for C
।
কারণ (নন সি ++) জিসিসি কখনই "টেম্পলেট অ্যালিয়াসগুলি" সমর্থন করে না (দেখুন http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2258.pdf ) আপনাকে অবশ্যই -x c++
বিকল্পটি যুক্ত করতে হবে সি ++ কম্পাইলারের -x c++
অনুরোধকে বাধ্য করুন ( খালি ডামি ফাইলের পরিবর্তে বিকল্পগুলি ব্যবহারের জন্য ক্রেডিটগুলি ইউইচাও যান, নীচে দেখুন):
g++ -dM -E -x c++ /dev/null | fgrep __cpp_alias_templates
কোনও আউটপুট থাকবে না কারণ g ++ (সংশোধন 4.9.1, -std = gnu ++ 98 এ ডিফল্ট) সি ++ 11-বৈশিষ্ট্যগুলি ডিফল্টরূপে সক্ষম করে না। এটি করতে, ব্যবহার করুন
g++ -dM -E -x c++ -std=c++11 /dev/null | fgrep __cpp_alias_templates
যা শেষ পর্যন্ত ফলন দেয়
#define __cpp_alias_templates 200704
জি ++ 9.৯.১ উল্লেখ করে যখন অনুরোধ করা হয় তখন "টেম্পলেট অ্যালিয়াসস" সমর্থন করে -std=c++11
।
-x
যুক্তির সমর্থন করে তাই g++ -x c++ -dM -E -std=c++11 - < /dev/null | grep cpp
কাজ করা উচিত।
একটি পোর্টেবল অ্যাপ্রোচ যা লিনাক্স বা উইন্ডোজে সমানভাবে ভাল কাজ করে (যেখানে কোনও দেব / নাল নেই):
echo | gcc -dM -E -
সি ++ এর জন্য আপনি ব্যবহার করতে পারেন ( c++11
আপনি যে সংস্করণ ব্যবহার করেন তা প্রতিস্থাপন করুন ):
echo | gcc -x c++ -std=c++11 -dM -E -
এটি জিপিসি প্রিপ্রোসেস স্টিডিনকে (যা প্রতিধ্বনি দ্বারা উত্পাদিত হয়) এবং সমস্ত প্রিপ্রসেসর সংজ্ঞায়িত (সন্ধান -dletters
) মুদ্রণ করে কাজ করে । আপনি যদি শিরোনামের ফাইল অন্তর্ভুক্ত করবেন তখন সংজ্ঞাগুলি কী যুক্ত হয় তা জানতে চাইলে আপনি -dD
বিকল্পটি ব্যবহার করতে পারেন যা -ডিএম এর অনুরূপ তবে পূর্বনির্ধারিত ম্যাক্রোগুলি অন্তর্ভুক্ত নয়:
echo "#include <stdlib.h>" | gcc -x c++ -std=c++11 -dD -E -
দ্রষ্টব্য, তবে, যে খালি ইনপুটটি এখনও -dD
বিকল্প সহ প্রচুর সংজ্ঞা দেয় produces
NUL
স্কয়ার একের দিকে ফিরে যান: এটি এমন সিস্টেমে কাজ করবে না।
sort
কিছুটা ভিন্ন আচরণ করে):echo | gcc -x c++ -std=c++17 -dM -E - | sort
একটি জটিল প্রকল্পে কাজ করার সময় যেখানে জটিল বিল্ড সিস্টেম রয়েছে এবং যেখানে জিসিসি / জি ++ কমান্ডটি পাওয়া (বা সংশোধন) করা কঠিন সেখানে সরাসরি ম্যাক্রো বিস্তারের ফলাফল দেখার আরও একটি উপায় রয়েছে। কেবলমাত্র ম্যাক্রোর নতুন সংজ্ঞা দিন এবং আপনি নিম্নলিখিতগুলির সাথে একইভাবে আউটপুট পাবেন:
file.h: note: this is the location of the previous definition
#define MACRO current_value