জিসিসি ডাম্প প্রিপ্রোসেসর সংজ্ঞায়িত করে


248

জিসিসি / জি ++ এর প্রিপ্রসেসরটি কমান্ড লাইন থেকে সংজ্ঞায়িত করার জন্য কি কোনও উপায় আছে? আমি ভালো মানে জিনিষ __GNUC__, __STDC__, ইত্যাদি।

উত্তর:


304

হ্যাঁ, -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 এর প্রতিশব্দ হিসাবে ব্যাখ্যা করা হয়।


4
gcc এমন সিস্টেমে বিদ্যমান যেখানে / dev / নাল মানে কিছুই নয়।
পাভেল পি

4
@ পাভেল তারপরে আপনি জিসিসি বা প্রিপ্রসেসর - সিপিপি সহ একটি খালি ফাইল ব্যবহার করতে পারেন।
জনগণ

16
আমি বিকল্প উত্তর হিসাবে আরও বহনযোগ্য পন্থা যুক্ত করেছি: echo | gcc -dM -E -উইন্ডোতেও কাজ করে।
পাভেল পি

4
এই সংজ্ঞাগুলি কোথা থেকে এসেছে (যেমন কোন ফাইলটিতে) তা নির্ধারণ করা সম্ভব?
এডাম

2
বিকল্পভাবে, উইন্ডোজ, cpp -dM -E - < NULব্যবহার করা যেতে পারে।
রেনি নাইফেনিগার

78

আমি সাধারণত এটি এইভাবে করি:

$ 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

45

দেরীতে উত্তর - আমি অন্যান্য উত্তরগুলি দরকারী বলে খুঁজে পেয়েছি - এবং কিছুটা অতিরিক্ত যুক্ত করতে চেয়েছিলাম।


আমি একটি নির্দিষ্ট শিরোলেখ ফাইল থেকে আগত প্রিপ্রসেসর ম্যাক্রোগুলি কীভাবে ডাম্প করব?

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
$ 

1
আপনি পাইপগুলি এড়ানোর জন্য অন্তর্ভুক্ত সংকলক বিকল্পটি ব্যবহার করতে পারেন
মায়ামিডিয়া

31

সাধারণ পদ্ধতির ( 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


7
আপনাকে একটি ডামি ফাইল ব্যবহার করতে হবে না। জিসিসি -xযুক্তির সমর্থন করে তাই g++ -x c++ -dM -E -std=c++11 - < /dev/null | grep cppকাজ করা উচিত।
yuyichao

@ ইয়ুইচাও আপনাকে ধন্যবাদ, এটি ব্যবহার করা সহজ করে তোলে। আমি -x বিকল্প সম্পর্কে অবগত ছিলাম না। আপনার মন্তব্য সমর্থন এবং এটি মূল উত্তরে একীভূত।
Hermannk

23

একটি পোর্টেবল অ্যাপ্রোচ যা লিনাক্স বা উইন্ডোজে সমানভাবে ভাল কাজ করে (যেখানে কোনও দেব / নাল নেই):

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


6
@ রুবেনভ এটি অপ্রাসঙ্গিক। বিন্দুটি হ'ল সেমিডি লাইন যা উইন্ডোজ এবং ইউনিক্সে কমপক্ষে সমানভাবে ভাল কাজ করে। আপনি যদি ব্যবহার করেন তবে আপনি NULস্কয়ার একের দিকে ফিরে যান: এটি এমন সিস্টেমে কাজ করবে না।
পাভেল পি

2
সি ++ এর জন্য পুরো উত্তর যুক্ত করা, উইন্ডোজ এবং লিনাক্স উভয় ক্ষেত্রেই কাজ করে (যদিও sortকিছুটা ভিন্ন আচরণ করে):echo | gcc -x c++ -std=c++17 -dM -E - | sort
Xeverous

এটি গিট-ব্যাশে খালি আউটপুট উত্পাদন করে।
লেনার্ট রোল্যান্ড

@ লেনার্টরোল্যান্ডের কি এটি জিসিসি আছে? আমার গিট-ব্যাশে আমি জিসিসি চালাতে পারি না
পাভেল পি

@ পাভেল আমি মিংডব্লিউ 32 জিসিসি ব্যবহার করি যা উইন্ডোজের জন্য কিউটি 5 বাইনারি বিতরণ করে।
লেনার্ট রোল্যান্ড

3

একটি জটিল প্রকল্পে কাজ করার সময় যেখানে জটিল বিল্ড সিস্টেম রয়েছে এবং যেখানে জিসিসি / জি ++ কমান্ডটি পাওয়া (বা সংশোধন) করা কঠিন সেখানে সরাসরি ম্যাক্রো বিস্তারের ফলাফল দেখার আরও একটি উপায় রয়েছে। কেবলমাত্র ম্যাক্রোর নতুন সংজ্ঞা দিন এবং আপনি নিম্নলিখিতগুলির সাথে একইভাবে আউটপুট পাবেন:

file.h: note: this is the location of the previous definition
#define MACRO current_value

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