প্রিস্রোসেসিংয়ের পরে জিসিসি আউটপুট সি কোড করতে পারে?


104

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

জিসিসি (বা লিনাক্সে সাধারণত উপলব্ধ অন্য কোনও সরঞ্জাম) এই লাইব্রেরিটি ছাড়া কি সি কোড কোড আউটপুট পড়তে পারে যা প্রাক-প্রসেসিংকে যা কিছুতে রূপান্তরিত করে এবং কোনও মানুষের দ্বারা পাঠযোগ্যও হয়?


প্রিপ্রোসেসড কোডটির আর কোনও প্রিপ্রোসেসর নির্দেশ নেই তবে আমি নিশ্চিত যে এটি প্রিপ্রোসেসড হওয়ার আগে অনেক কম পঠনযোগ্য হবে ...
অ্যালেক্স ডাব্লু

2
@ অ্যালেক্সডব্লু - এটি সম্পূর্ণরূপে নির্ভর করে কোডটি লেখার লোকরা কীভাবে প্রিপ্রোসেসরকে গালি দিয়েছে abused
ভুয়া নাম

1
এখানে আপনার গৃহীত উত্তর পরিবর্তন বিবেচনা করুন। gcc -Eলাইনের সাথে কাজ করার জন্য এটি পুনরায় লেখার চেয়ে বেশি দরকারী cpp
ধূসর

উত্তর:


193

হ্যাঁ. জিসিসি -Eবিকল্পটি পাস করুন । এটি প্রাকপ্রসেসেড উত্স কোড আউটপুট দেবে।


12
যদি আপনার সংকলক কমান্ডগুলির ইতিমধ্যে আপনার মতো প্যারামিটার থাকে তবে এটি এটিতেও -o something.oপরিবর্তন করতে চাইতে পারে -o something.i। অন্যথায় প্রিপ্রোসেসড আউটপুট .oফাইলটিতে থাকবে।
টোর ক্লিংবার্গ

@ টরকলিংবার্গ আমি কি একসাথে একাধিক ফাইলের জন্য এটি করতে পারি?
ব্যবহারকারী2808264

@ user2808264gcc -E file1.c file2.c ...
Matthieu

68

cpp প্রিপ্রোসেসর।

cpp filename.cপ্রিপ্রসেসড কোডটি আউটপুট দিতে চালান , বা আরও ভাল, এটি কোনও ফাইলে পুনর্নির্দেশ করুন cpp filename.c > filename.preprocessed


2
আমি মনে করি এটি সেরা উত্তর কারণ এটি সরাসরি সিপিপি প্রদর্শন করে। লিনাক্স সিস্টেমগুলি (কমপক্ষে মাঞ্জারো) ডিফল্টরূপে -E বলে মনে হয়। আমি এই কমান্ড থেকে একইভাবে একইভাবে ফলাফল পাই। diffফাইলগুলিতে কোনও পার্থক্য নেই। এটি আপনার ম্যাক্রোগুলিতে ত্রুটিগুলি খুঁজছেন কোডটি প্রিপ্রোসেস করার একটি দরকারী উপায় বলে মনে হচ্ছে। দুর্দান্ত প্রশ্ন এবং দুর্দান্ত উত্তর (IALCTHW)।
lee8oi

17

আমি জিসিসি একটি প্রিপ্রোসেসর হিসাবে ব্যবহার করছি (এইচটিএমএল ফাইলের জন্য।) এটি আপনি যা চান ঠিক তেমন করে। এটি "# -" নির্দেশিকা প্রসারিত করে, তারপরে একটি পঠনযোগ্য ফাইল আউটপুট দেয়। (অন্যান্য সি / এইচটিএমএল প্রিপ্রোসেসরগুলির মধ্যে আমি এটি করার চেষ্টা করেছি they তারা লাইনগুলিকে একত্রিত করে, বিশেষ চরিত্রগুলিতে চাপ দেয়, ইত্যাদি) আপনি জিসিসি ইনস্টল করে নিলেন, কমান্ড লাইনটি হ'ল:

জিসিসি-ই-এক্সসি -পি -সি-ট্র্যাডিশনাল-সিপিপি কোড_বিফর।

('সিপিপি' হতে হবে না)) http://www.cs.tut.fi/~jkorpela/html/cpre.html এ এই ব্যবহারের দুর্দান্ত বর্ণনা রয়েছে

"প্রচলিত- cpp" সাদা স্থান এবং ট্যাব সংরক্ষণ করে s


অনেক ধন্যবাদ, পাইথন সিএফআই সিডিএফ তৈরি করতে এটি খুব সহায়ক!
amirouche

13

-save-temps

এটি মনে রাখার জন্য আরও একটি ভাল বিকল্প:

gcc -save-temps -c -o main.o main.c

main.c

#define INC 1

int myfunc(int i) {
    return i + INC;
}

এবং এখন, স্বাভাবিক আউটপুট ছাড়াও main.o, বর্তমান ওয়ার্কিং ডিরেক্টরিতে নিম্নলিখিত ফাইলগুলি রয়েছে:

  • main.i কাঙ্ক্ষিত প্রিপোসেসসযুক্ত ফাইলটি এতে রয়েছে:

    # 1 "main.c"
    # 1 "<built-in>"
    # 1 "<command-line>"
    # 31 "<command-line>"
    # 1 "/usr/include/stdc-predef.h" 1 3 4
    # 32 "<command-line>" 2
    # 1 "main.c"
    
    
    int myfunc(int i) {
        return i + 1;
    }
  • main.s এটি একটি বোনাস :-) এবং উত্পন্ন সমাবেশ ধারণ করে:

        .file   "main.c"
        .text
        .globl  myfunc
        .type   myfunc, @function
    myfunc:
    .LFB0:
        .cfi_startproc
        pushq   %rbp
        .cfi_def_cfa_offset 16
        .cfi_offset 6, -16
        movq    %rsp, %rbp
        .cfi_def_cfa_register 6
        movl    %edi, -4(%rbp)
        movl    -4(%rbp), %eax
        addl    $1, %eax
        popq    %rbp
        .cfi_def_cfa 7, 8
        ret
        .cfi_endproc
    .LFE0:
        .size   myfunc, .-myfunc
        .ident  "GCC: (Ubuntu 8.3.0-6ubuntu1) 8.3.0"
        .section    .note.GNU-stack,"",@progbits

আপনি যদি এটি বৃহত সংখ্যক ফাইলের জন্য করতে চান তবে পরিবর্তে এটি ব্যবহারের কথা বিবেচনা করুন:

 -save-temps=obj

যা মধ্যবর্তী ফাইলগুলিকে -oবর্তমান কার্যনির্বাহী ডিরেক্টরিটির পরিবর্তে অবজেক্ট আউটপুট হিসাবে একই ডিরেক্টরিতে সংরক্ষণ করে , ফলে সম্ভাব্য বেসনাম বিবাদগুলি এড়িয়ে চলে।

এই বিকল্পটির সুবিধাটি -Eহ'ল বিল্ডটিতে খুব হস্তক্ষেপ না করে এটি কোনও বিল্ড স্ক্রিপ্টে যুক্ত করা সহজ।

এই বিকল্পটি সম্পর্কে আরও একটি দুর্দান্ত জিনিস হ'ল আপনি যদি যুক্ত করেন -v:

gcc -save-temps -c -o main.o -v main.c

এটি প্রকৃতপক্ষে কুশলী অস্থায়ীগুলির পরিবর্তে সুস্পষ্ট ফাইলগুলি ব্যবহৃত হচ্ছে তা দেখায় /tmp, সুতরাং ঠিক কী চলছে তা জানতে সহজতর, যার মধ্যে প্রাকপ্রসেসিং / সংকলন / সমাবেশ পদক্ষেপগুলি অন্তর্ভুক্ত রয়েছে:

/usr/lib/gcc/x86_64-linux-gnu/8/cc1 -E -quiet -v -imultiarch x86_64-linux-gnu main.c -mtune=generic -march=x86-64 -fpch-preprocess -fstack-protector-strong -Wformat -Wformat-security -o main.i
/usr/lib/gcc/x86_64-linux-gnu/8/cc1 -fpreprocessed main.i -quiet -dumpbase main.c -mtune=generic -march=x86-64 -auxbase-strip main.o -version -fstack-protector-strong -Wformat -Wformat-security -o main.s
as -v --64 -o main.o main.s

উবুন্টু 19.04 amd64 এ পরীক্ষিত, জিসিসি 8.3.0।


1
-ই এর চেয়ে অনেক বেশি মার্জিত কারণ আমি বিল্ড স্ক্রিপ্টের সামগ্রিক আচরণ পরিবর্তন না করেই কেবল সিএফএলএজিজে-সেভ-টেম্পগুলি যুক্ত করতে পারি। ধন্যবাদ!
এভারটাব্লু

এটি সত্যই কার্যকর এবং একক ফাইলগুলির জন্য -E খুব সুবিধাজনক।
সুবিন সেবাস্তিয়ান


1

মনে করুন আমাদের কাছে ম্যাসেজ। সিপি বা একটি .c ফাইল হিসাবে একটি ফাইল রয়েছে

পদক্ষেপ 1: প্রাক প্রসেসিং (তর্ক -E)

g ++ -E। \ Message.cpp> পি 1

উত্পন্ন P1 ফাইলটি ম্যাক্রো এবং শিরোলেখের ফাইলের সামগ্রীগুলি প্রসারিত করেছে এবং মন্তব্যগুলি বন্ধ করে দেওয়া হয়েছে।

পদক্ষেপ 2: প্রিপ্রেসেসড ফাইলটি অ্যাসেমব্লিতে অনুবাদ করুন (আর্গুমেন্ট-এস)। এই কাজটি সংকলক দ্বারা সম্পন্ন হয়

g ++ -S। \ Message.cpp

একটি এসেমব্লার (এএসএম) তৈরি করা হয় (বার্তা.স)। এটিতে সমস্ত সমাবেশের কোড রয়েছে।

পদক্ষেপ 3: অজবি কোডে অ্যাসেম্বলি কোডটি অনুবাদ করুন। দ্রষ্টব্য: বার্তা.এসগুলি পদক্ষেপ 2 এ উত্পন্ন হয়েছিল। g ++ -c। \ Message.s

বার্তা.ও নামের একটি অবজেক্ট ফাইল উত্পন্ন হয়। এটি বাইনারি ফর্ম।

পদক্ষেপ 4: অবজেক্ট ফাইলের লিঙ্ক করা। এই কাজটি লিঙ্কার দ্বারা সম্পন্ন হয়

g ++। \ Message.o -o বার্তা অ্যাপ্লিকেশন

এখানে একটি এক্সাইপ ফাইল বার্তা অ্যাপ.এক্সই উত্পন্ন হয়।

#include <iostream>
using namespace std;

 //This a sample program
  int main()
{
cout << "Hello" << endl;
 cout << PQR(P,K) ;
getchar();
return 0;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.