আমি সম্পাদনা করতে চাই না তৃতীয় পক্ষের কোডটিতে জিসিসি থেকে অব্যবহৃত পরিবর্তনশীল সতর্কতাগুলি কীভাবে অক্ষম করবেন?


94

আমি জানতে চাইব আপনি অব্যবহৃত ভেরিয়েবল সতর্কতা বন্ধ করতে জিসিসি সংকলকটি কী সুইচটি পাস করেন? আমি উইন্ডোগুলিতে উত্সাহ দেওয়ার কারণে ত্রুটিগুলি পাচ্ছি এবং আমি বুস্ট কোডটি স্পর্শ করতে চাই না:

C:\boost_1_52_0/boost/system/error_code.hpp: At global scope:
C:\boost_1_52_0/boost/system/error_code.hpp:214:36: error: 'boost::system::posix_category' defined but not used [-Werror=unused-variable]
C:\boost_1_52_0/boost/system/error_code.hpp:215:36: error: 'boost::system::errno_ecat' defined but not used [-Werror=unused-variable]
C:\boost_1_52_0/boost/system/error_code.hpp:216:36: error: 'boost::system::native_ecat' defined but not used [-Werror=unused-variable]

আমি উভয়ই ব্যবহার করার চেষ্টা করেছি -Wunused-valueএবং -Wno-unused-valueউপরের বার্তাগুলি দুটিকেই দমন করেছি।

ডান কমান্ডটি কী, এখানে আমার সংকলন লাইনটি রয়েছে:

g++  -g -fno-inline -Wall -Werror -Wextra -Wfloat-equal -Wshadow
-Wpointer-arith -Wcast-qual -Wcast-align -Wwrite-strings -Wno-conversion 
-Wdisabled-optimization -Wredundant-decls -Wunused-value -Wno-deprecated 
-IC:\\boost_1_52_0 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 
-c -o op.o op.cpp

সম্ভবত -Wallআমার লক্ষ্য ওভার্রাইড?


ত্রুটির বার্তাটি কম বেশি বলেছে, চেষ্টা করুন-Werror=no-unused-variable
জোয়াকিম ইসাকসন

উত্তর:


242

-Wno-unused-variableসুইচ সাধারণত কৌতুক আছে। তবে আপনি যদি আপনার প্রকল্পে এই বিষয়গুলি যত্ন নেন তবে তা সত্যিই একটি দরকারী সতর্কতা। এটি আপনার বিরক্তিকর হয়ে ওঠে যখন জিসিসি আপনাকে আপনার কোডে না থাকা বিষয়গুলি সম্পর্কে সতর্ক করতে শুরু করে।

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

উদাহরণস্বরূপ, পরিবর্তে -IC:\\boost_1_52_0, বলুন -isystem C:\\boost_1_52_0

আশা করি এটা সাহায্য করবে. শুভকামনা!


এই সেটিংটি কোথায় যুক্ত করবেন? এটি "প্রকল্প সেটিংস / এভিআর জিএনইউ সি সংকলক / বিবিধ" এর আওতায় থাকলেও এটি এড়ানো হবে (পথ সঠিক, তবুও সতর্কতা পান) ডিরেক্টরি সেটিংসে যোগ করার সময় (আপেক্ষিক পাথ চেকবক্সটি নির্বাচন না করা) আটমেলস্টুডিও ক্র্যাশ হয়ে যাবে।
এইচএফআরমোবাইল

4
আমাদের -Wno-unused-parameterঅব্যবহৃত ফাংশন প্যারামিটারগুলির জন্যও , -Wno-unused-functionঅব্যবহৃত ফাংশনের জন্য
এনজিও থানহ নহন

4
আপনার প্রয়োজন:-Wno-unused-but-set-variable -Wno-unused-parameter -Wno-unused-variable
রনি শেরার

84

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

void func(unsigned number, const int version)
{
  unsigned tmp;
  std::cout << number << std::endl;
}

কোনও পরিস্থিতি হতে পারে, যখন আপনাকে হ্যান্ডলার হিসাবে এই ফাংশনটি ব্যবহার করার দরকার হয় - যা (ইমো) সি ++ বুস্ট লাইব্রেরিতে বেশ সাধারণ। তারপরে আপনার দ্বিতীয় ফর্মাল প্যারামিটার সংস্করণ প্রয়োজন , সুতরাং হ্যান্ডলার যে টেম্পলেটটির প্রয়োজন তা ফাংশনের স্বাক্ষরটি একই, অন্যথায় সংকলন ব্যর্থ হবে। তবে আপনি নিজেই ফাংশনে এটির দরকার নেই ...

কীভাবে পরিবর্তনশীল বা আনুষ্ঠানিক প্যারামিটারকে সতর্কতা থেকে বাদ দেওয়া যায় তার সমাধান হ'ল:

void func(unsigned number, const int version __attribute__((unused)))
{
  unsigned tmp __attribute__((unused));
  std::cout << number << std::endl;
}

জিসিসির আরও অনেকগুলি প্যারামিটার রয়েছে, আপনি সেগুলি ম্যান পৃষ্ঠাগুলিতে পরীক্ষা করতে পারেন । এটি কেবল সি ++ নয়, সি প্রোগ্রামগুলির জন্যও কাজ করে এবং আমি মনে করি এটি কেবল হ্যান্ডলারদের নয়, প্রায় প্রতিটি ফাংশনে ব্যবহার করা যেতে পারে। এগিয়ে যান এবং এটি চেষ্টা করুন! ;)

পিএস: ইদানীং আমি এটির মতো টেমপ্লেটে বুস্টের সিরিয়ালাইজেশনের সতর্কতা দমন করতে এটি ব্যবহার করেছি:

template <typename Archive>
void serialize(Archive &ar, const unsigned int version __attribute__((unused)))

সম্পাদনা: স্পষ্টতই, আপনার প্রয়োজন অনুসারে আমি আপনার প্রশ্নের জবাব দিলাম না, ড্রাক0 শ্যাশা এটি আরও ভাল করেছে। এটি কারণ আমি প্রধানত প্রশ্নের শিরোনাম অনুসরণ করেছি, আমার খারাপ। আশা করি, এটি অন্যান্য লোককে সহায়তা করতে পারে, যারা এই শিরোনামের কারণে এখানে আসেন ... :)


7
আনুষ্ঠানিক পরামিতিগুলির জন্য, আপনি নামটি বাদ দিতে পারেন, যেমন void func(unsigned number, const int)। তারপরে, জিসিসিও অব্যবহৃত সম্পর্কে অভিযোগ করবে না version
ওলাফ ডিয়েটশে

@ ওলাফডিয়েটসে আমি মনে করি এটি gccআপনি যে সংস্করণটি ব্যবহার করছেন তার উপর নির্ভর করে। আইআইআরসি, অব্যবহৃত সম্পর্কে সতর্কতা দমন করতে আমাকে 4 বছর আগে এগুলি ব্যবহার করতে হয়েছিল version। ;)
Dee'Kej

67

আপনি যদি জিসিসি ব্যবহার করেন এবং নির্বাচিত কোডের জন্য সতর্কতাটি অক্ষম করতে চান, আপনি # প্রগমা সংকলক নির্দেশিকাটি ব্যবহার করতে পারেন:

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-variable"
( your problematic library includes )
#pragma GCC diagnostic pop

আপনার নিয়ন্ত্রণ করা কোডের জন্য, আপনি __attribute__((unused))সংকলকটি নির্দেশ করতে ব্যবহার করতে পারেন যে নির্দিষ্ট ভেরিয়েবল ব্যবহার করা হয় না।



সাধারণত, আমি বলব # প্রাগমা নির্দেশিকা ব্যবহার করা খুব বেশি নিরাপদ নয়, যদি না আপনি সত্যিই জানেন যে আপনি কী করছেন বা আপনি যেমন সমান্তরালনের জন্য
ওপেনএমপি

4
@ ডি'কেজের #pragmaনির্দেশাবলী যদি আপনি এতে আবদ্ধ করেন তবে পুরোপুরি নিরাপদ #ifdef some_compiler ... #endif। সতর্কতাগুলি একটি সংকলক-নির্দিষ্ট বৈশিষ্ট্য এবং মান দ্বারা সংজ্ঞায়িত হয় না। কোড ছাড়াই আপনি কোনও সতর্কতা দমন করতে পারবেন না #pragma
কোটাউস্কাস

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

15

man gccসতর্কতা বিকল্পগুলির অধীনে দেখুন । সেখানে আপনার পুরো গোছা আছেunused

সতর্কতা বিকল্পগুলি
... -উনউজড -উন্ডুজেড-ফাংশন -উনিউজড-লেবেল -উনুজেড-প্যারামিটার -উনউসড-মান -উন্ডোসড-ভেরিয়েবল -উনিউজড-তবে-সেট-প্যারামিটার -উনিউজড-তবে-সেট-ভেরিয়েবল

আপনি যদি এগুলির কোনওটির সাথে উপসর্গ করেন no-, এটি এই সতর্কতাটি অক্ষম করবে।

অনেকগুলি বিকল্পের দীর্ঘ নাম রয়েছে যার সাথে -f বা -W --- শুরু হয়, উদাহরণস্বরূপ, -ফমোভ-লুপ-আক্রমণকারী, -ওয়ার্ডফর্ম এবং আরও। এর বেশিরভাগেরই ইতিবাচক এবং নেতিবাচক উভয় রূপ রয়েছে; -ফু-র নেতিবাচক রূপটি হবে - Fno-foo। এই ম্যানুয়ালটি এই দুটি ফর্মের মধ্যে একটিরই নথী, যে কোনও একটি ডিফল্ট নয়।

সতর্কতাগুলিকে অনুরোধ বা দমন করার বিকল্পগুলিতে আরও বিস্তারিত ব্যাখ্যা পাওয়া যাবে


জানতাম না যে আমি কোনও সতর্কতা সহ "নো" উপস্থাপন করতে পারি।
আরএনএ

10

ব্যবহার -Wno-unused-variableকাজ করা উচিত।


আহ, অব্যবহৃত-পরিবর্তনশীল, অব্যবহৃত-মান নয়!
উইলিয়াম কেএফ

4
অথবা -Wno-error=unused-variableআপনি যদি ত্রুটিটি সরিয়ে সতর্কতা রাখতে চান তবে keep
ওসকার এন।

4
প্রকৃত সতর্কতা কী তা আপনি আসলে দেখতে পারেন [-Werror=unused-variable]
ম্যাটস পিটারসন

3

সংকলক ইতিমধ্যে আপনাকে বলছে, এটি valueকিন্তু না variable। আপনি খুঁজছেন -Wno-unused-variable। এছাড়াও, g++ --help=warningsউপলব্ধ বিকল্পগুলির একটি তালিকা দেখার চেষ্টা করুন।


3

আপনি কীভাবে জিসিসি থেকে অব্যবহৃত পরিবর্তনশীল সতর্কতাগুলি অক্ষম করবেন?
আমি উইন্ডোতে উত্সাহ প্রদানের কারণে ত্রুটিগুলি পাচ্ছি এবং আমি বুস্ট কোডটি স্পর্শ করতে চাই না ...

আপনি বুস্টের ট্র্যাকটি দেখুন এবং বুস্টের বিরুদ্ধে একটি বাগ রিপোর্ট ফাইল করেন।

আপনার অ্যাপ্লিকেশন লাইব্রেরি সতর্কতা এবং ত্রুটি সাফ করার জন্য দায়ী নয়। গ্রন্থাগারটি তার নিজস্ব সতর্কতা এবং ত্রুটিগুলি পরিষ্কার করার জন্য দায়বদ্ধ।


0

-Wallএবং -Wextraজিসিসিতে মঞ্চটি সেট করে এবং পরবর্তীকালে এটি -Wno-unused-variableকার্যকর নাও হতে পারে। উদাহরণস্বরূপ, যদি আপনার:

CFLAGS += -std=c99 -pedantic -pedantic-errors -Werror -g0 -Os \ -fno-strict-overflow -fno-strict-aliasing \ -Wall -Wextra \ -pthread \ -Wno-unused-label \ -Wno-unused-function \ -Wno-unused-parameter \ -Wno-unused-variable \ $(INC)

তারপরে জিসিসি নির্দেশ দেখেন এবং এটিকে -Wall -Wextraউপেক্ষা করবেন বলে মনে হয়-Wno-unused-variable

এটি পরিবর্তে নীচের মত দেখতে পারে এবং অব্যবহৃত ভেরিয়েবলের উপর আপনার সংকলনটি বন্ধ না হওয়ার কাঙ্ক্ষিত প্রভাব পাবেন:

CFLAGS += -std=c99 -pedantic -pedantic-errors -Werror -g0 -Os \ -fno-strict-overflow -fno-strict-aliasing \ -pthread \ -Wno-unused-label \ -Wno-unused-function \ $(INC)

এটির একটি "সতর্কতা" বনাম একটি "ত্রুটি" বলা হওয়ার একটি ভাল কারণ রয়েছে। আপনার কোডটি সম্পূর্ণ না হওয়ায় সংকলন ব্যর্থ হওয়া (বলুন যে আপনি অ্যালগোরিদমকে আঘাত করছেন) পরাস্ত হতে পারে।


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