জিসিসিতে সতর্কীকরণগুলি স্ট্রিং ধ্রুবক থেকে 'চর *' এ অবহিত রূপান্তর থেকে কীভাবে মুক্তি পাবেন?


409

সুতরাং আমি অত্যন্ত বড় কোডবেসে কাজ করছি এবং সম্প্রতি জিসিসি ৪.৩-তে আপগ্রেড করেছি, যা এখন এই সতর্কবার্তাটিকে ট্রিগার করে:

সতর্কতা: স্ট্রিং ধ্রুবক থেকে 'চর *' এ রূপান্তর

স্পষ্টতই, এটি ঠিক করার সঠিক উপায়টি হ'ল প্রতিটি ঘোষণার মতো

char *s = "constant string";

বা ফাংশন কল যেমন:

void foo(char *s);
foo("constant string");

এবং তাদের const charপয়েন্টার করুন। তবে, এর অর্থ হবে 564 টি ফাইল ছোঁয়া, ন্যূনতম, যা কোনও কাজ নয় যা আমি এই সময়ে সম্পাদন করতে চাই। এখনই সমস্যাটি হ'ল আমি চালাচ্ছি -werror, সুতরাং এই সতর্কতাগুলিকে প্রশমিত করার জন্য আমার কিছু উপায় প্রয়োজন। আমি এটা কিভাবে করবো?


আপনি যখন 554 টি লাইন প্রতিস্থাপনের বিষয়টি মোকাবেলা করতে আসেন, সেড ভাল বন্ধু। আপনি অবশ্যই প্রথমে ব্যাক আপ নিশ্চিত করুন।
ম্যাট

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

পুরো আলোচনার কারণটি হ'ল এটি কেন এমন সমস্যা যা জিসিসি সতর্কতা অনুসারে একেবারে ফিক্সিংয়ের প্রয়োজন। কারণটি হল ডেভিড শোয়ার্জের উত্তর স্ট্যাকওভারফ্লো . com / প্রশ্নগুলি / 6565৫২২65৫৪/২
অ্যান্ডিগ

উত্তর:


227

আমার বিশ্বাস -Wno-write-stringsজিসিসিতে পাস করা এই সতর্কতাটি দমন করবে।


6
এটি প্রাগমাস ব্যবহার করে প্রতি ফাইল বেসে অক্ষম করা যায়।
প্রিয়ঙ্ক বলিয়া

18
@ প্রিয়ঙ্কবোলিয়া বিডনলান রব ওয়াকারের উত্তর যে এটি ব্যবহার করতে পারে তার সম্পর্কে মন্তব্য করেছিল #pragma GCC diagnostic ignored "-Wwrite-strings"
মাস্টারমাস্টিক

9
আপনি যদি এপিআই নিয়ন্ত্রণ করেন তবে ব্যতীত @ জনের উত্তর, কনস্ট চর * স্বাক্ষরের স্বাক্ষর পরিবর্তন সম্পর্কে আরও সঠিক।
jcwenger

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

9
আমি সম্মত, আপনার এই সতর্কতা থেকে মুক্তি পাওয়া উচিত নয় এবং পরিবর্তে জন দ্বারা সরবরাহিত সমাধানটি ব্যবহার করা উচিত। খুব খারাপ এটির একটি গৃহীত উত্তর!
জেরুমে

563

স্ট্রিং লিটারালগুলি যে কোনও ফাংশনে আপনি পাস করেন তার পরিবর্তে প্রকার হিসাবে "I am a string literal"ব্যবহার char const *করা উচিত char*

আপনি যদি কিছু ঠিক করতে চলেছেন তবে ঠিক করুন।

ব্যাখ্যা:

স্ট্রিং লিটারালগুলি স্ট্রিংগুলির আরম্ভ করতে ব্যবহার করতে পারবেন না যা সংশোধিত হবে, কারণ সেগুলি টাইপ const char*। কাস্টিং দূরে constness পরে তাদের পরিবর্তন হয় অনির্ধারিত আচরণ , যাতে আপনি আপনার কপি আছে const char*স্ট্রিং charদ্বারা charপরিবর্তনশীল বরাদ্দ মধ্যে char*অর্ডার তাদের পরিবর্তন করার জন্য স্ট্রিং।

উদাহরণ:

#include <iostream>

void print(char* ch);

void print(const char* ch) {
    std::cout<<ch;
}

int main() {
    print("Hello");
    return 0;
}

25
এটি সত্য হলেও, আপনার তৃতীয় পক্ষের এপিআই এর সর্বদা নিয়ন্ত্রণ থাকে না যা সম্ভবত সঠিকভাবে char */ ব্যবহার করতে পারে না const char *, তাই সেক্ষেত্রে আমি সাধারণত কাস্ট করি।
ধারণাগুলি 42

15
@ পিপমকিন দুর্ভাগ্যক্রমে, অনেক সি স্ট্যান্ডার্ড লাইব্রেরি স্ট্রিং ফাংশন এমন char*স্ট্রিংগুলির পক্ষে যুক্তিও গ্রহণ করে যা পরিবর্তিত হবে না। আপনি যদি কোনও পরামিতি গ্রহণ করেন char const*এবং এটি গ্রহণ করে কোনও স্ট্যান্ডার্ড ফাংশনে পৌঁছে দেন তবে char*আপনি তা হিট করবেন। লাইব্রেরি ফাংশন স্ট্রিং সাধিত হবে না থাকে, তাহলে আপনি দূরে কাস্ট করতে পারে const
জন

কেবলমাত্র এটি সর্বদা সম্ভব নয় এর অর্থ এই নয় যে সাধারণ উত্পাদন কোডে এই সতর্কতাটি প্রদর্শিত হয় তার বেশিরভাগ ক্ষেত্রে এটি পছন্দসই বিকল্প নয়।
ভালোবাসা থা

1
আমি এখন সমাধানটি এবং স্ট্রিং লিটারেলের কার্যকারিতাটি পুরোপুরি বুঝতে পারি। তবে অন্যরা তা না করে, সুতরাং আমি ব্যাখ্যাটির প্রয়োজনীয়তাকে 'ধরে
রেখেছি

1
আপনার সমাধানটি কীভাবে প্রয়োগ করবেন তা আমি বুঝতে পারি না :(
desmond13

69

আমারও একই সমস্যা ছিল, আমি এটি এর মতো সমাধান করেছি:

#include <string.h>

extern void foo(char* m);

int main() {
    // warning: deprecated conversion from string constant to ‘char*’
    //foo("Hello");

    // no more warning
    char msg[] = "Hello";
    foo(msg);
}

এটি কি এটি সমাধানের উপযুক্ত উপায়? আমি fooএটি গ্রহণ করার জন্য অভিযোজিত অ্যাক্সেস নেই const char*, যদিও এটি আরও ভাল সমাধান হবে (কারণ fooপরিবর্তন হয় না m)।


8
@ এলকুকো, আপনি কি প্রস্তাব দেবেন? আমি foo সম্পাদনা করতে পারিনি, এবং এমন একটি সমাধান সন্ধান করার চেষ্টা করেছি যাতে সতর্কতার দমন প্রয়োজন হয় না। আমার ক্ষেত্রে উত্তরোত্তর ব্যায়ামের বিষয় ছিল তবে মূল পোস্টারের জন্য এটি গুরুত্বপূর্ণ মনে হয়েছিল। আমি যতদূর বলতে পারি, আমার উত্তরটি হ'ল একমাত্র যা আমার এবং ওপি উভয় অবস্থার একই সাথে সমাধান করবে যাতে এটি কারও কাছে মূল্যবান উত্তর হতে পারে। আপনি যদি মনে করেন আমার সমাধানটি যথেষ্ট ভাল না, আপনি দয়া করে কোনও বিকল্প সরবরাহ করতে পারেন? (এর মধ্যে
ফু ফু

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

এটিও আমি গ্রহণ করেছি। যদি কারো ক্ষেত্রে এই অনুসন্ধানের হয় char **মধ্যে PyArg_ParseTupleAndKeywordsআমি এই কিছু করুন:static char kw[][16] = {"mode", "name", "ip", "port"}; static char * kwlist[] = {kw[0], kw[1], kw[2], kw[3], NULL};
dashesy

@ এলকুকো: আমি নিশ্চিত না যে সি ++ স্ট্যাটিক অ্যারে কীভাবে কাজ করে। এটি কি কেবল কোনও পয়েন্টার নয়, কোনও ডেটা অনুলিপি করবে?
আলেকজান্ডার মালাখভ

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

69

জিসিসি এর পরীক্ষা করে দেখুন ডায়াগনস্টিক Pragma সমর্থন এবং একটি তালিকা -w সাবধানবাণী অপশন (পরিবর্তিত হয়েছে: সতর্কতা অপশন নতুন লিঙ্ক )।

জিসিসির জন্য, আপনি এখানে বর্ণিত #pragma warningনির্দেশাবলী ব্যবহার করতে পারেন ।


54
এটি আসলে করে: # প্রগমা জিসিসি ডায়াগোনস্টিক "-Wwrit-तार" "উপেক্ষা করেছে
বিডনলান

30

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

find . -exec sed -E -i .backup -n \
    -e 's/char\s*\*\s*(\w+)\s*= "/char const* \1 = "/g' {} \;

এটি সমস্ত জায়গাগুলি (এমনকি ফাংশন কলগুলি বিবেচনা না করে) খুঁজে পেতে পারে না তবে এটি সমস্যার উপশম করতে পারে এবং বাকী কয়েকটি পরিবর্তন নিজেই সম্পাদন করা সম্ভব করে possible


7
এটি কেবল ঘোষণাপত্রের সতর্কবার্তাগুলি সমাধান করে এবং সেড ফুয়ের জন্য যে কোনও উপায়ে কল করতে হবে না: p
জোও পোর্তেলা

25

আমি সংকলক সুইচ ব্যবহার করতে পারি না। সুতরাং আমি এই পরিণত করেছি:

char *setf = tigetstr("setf");

এটি:

char *setf = tigetstr((char *)"setf");

1
+1 - আপনি অ্যাপ্লিকেশনগুলির মূল্যকে পরিবর্তন করতে পারবেন না, কেবলমাত্র মূল্য। এটি প্রকৃত সমস্যা সমাধানের প্রমাণিত হয়েছিল। সংকলকটি নিয়ে অন্যান্য সমস্যাগুলি নিয়ে কাজ করে।
এলকুকো

1
যে জিনিসটি সত্যিই বিরক্তিকর তা হ'ল টাইগ্রেসট্র () একটি (কনট চর *) দিয়ে নয়, একটি (চর *) নয়
v3232

2
আমি যখন এটি করি তখন আমি "সতর্কতা পাই: 'কনস্ট চর' টাইপ থেকে 'চর' টাইপ করার জন্য কাস্ট করতে পারি" পরিবর্তে "কন্সটেন্স দূরে রাখি। সমস্ত সতর্কতা থেকে মুক্তি পেতে আমাকে কনস্ট_কাস্ট ব্যবহার করতে হয়েছিল: কনস্ট_কাস্ট <চর *> ("সেটফ")
ক্রাউজ

2
আমি মনে করি কনস্ট কাস্ট হ'ল এই পৃষ্ঠায় প্রথম গ্রহণযোগ্য সমাধান (এপিআই পরিবর্তন বাদে)
rwst

25

এটি কোনও ফাইলে কীভাবে ইনলাইন করা যায় তা এখানে আপনার মেকফাইলে পরিবর্তন করতে হবে না।

// gets rid of annoying "deprecated conversion from string constant blah blah" warning
#pragma GCC diagnostic ignored "-Wwrite-strings"

আপনি পরে করতে পারেন ...

#pragma GCC diagnostic pop

25

প্রতিস্থাপন করা

char *str = "hello";

সঙ্গে

char *str = (char*)"hello";

বা যদি আপনি ফাংশনটিতে কল করছেন:

foo("hello");

এর সাথে প্রতিস্থাপন করুন

foo((char*) "hello");

15

পরিবর্তে:

void foo(char *s);
foo("constant string");

এইটা কাজ করে:

void foo(const char s[]);
foo("constant string");

এটি করার সঠিক উপায় এটি যেহেতু আপনার কোনও ফাংশনে কোনও (ধ্রুবক) স্ট্রিংটি পাস করা উচিত নয় যা কোনওভাবেই অ-ধ্রুব স্ট্রিংয়ের প্রত্যাশা করে!
jfla

15

সি ++ তে const_castনীচের মত ব্যবহার করুন

char* str = const_cast<char*>("Test string");

7

Test stringকনস্টিং স্ট্রিং। সুতরাং আপনি এর মতো সমাধান করতে পারেন:

char str[] = "Test string";

বা:

const char* str = "Test string";
printf(str);


2

ধ্রুব স্ট্রিং থেকে চর পয়েন্টার পর্যন্ত টাইপকাস্টিং করুন

char *s = (char *) "constant string";

1

সি ++ এ, প্রতিস্থাপন করুন:

char *str = "hello";

সঙ্গে:

std::string str ("hello");

এবং আপনি যদি এটি তুলনা করতে চান:

str.compare("HALLO");

1

আপনার সমাধানটি কীভাবে প্রয়োগ করতে হবে তা আমি বুঝতে পারি না :( - kalmanIsAGameChanger

আরডুইনো স্কেচের সাথে কাজ করা, আমার সতর্কতা সৃষ্টির জন্য আমার একটি ফাংশন ছিল।

আসল ফাংশন: Char StrContains (Char * str, Char * sfind)

সতর্কবার্তা বন্ধ করতে আমি যোগ const গৃহস্থালির কাজ সামনে * Str এবং গৃহস্থালির কাজ * sfind।

পরিবর্তিত: চর স্ট্রকন্টাইনস (কনস্ট চর * আরআর, কনস্ট চর * স্ফাইন্ড)।

সমস্ত সতর্কতা চলে গেল।


সতর্কবাণী অনুসারে এটি সঠিক উত্তরটি বলেছিল: "সতর্কতা: স্ট্রিং ধ্রুবক থেকে 'চর *' এ রূপান্তরিত করা হয়নি"।
নর্বার্ট বোরোস

0

এই পরিস্থিতি দেখুন:

typedef struct tagPyTypeObject
{
    PyObject_HEAD;
    char *name;
    PrintFun print;
    AddFun add;
    HashFun hash;
} PyTypeObject;

PyTypeObject PyDict_Type=
{
    PyObject_HEAD_INIT(&PyType_Type),
    "dict",
    dict_print,
    0,
    0
};

নাম ক্ষেত্রটি দেখুন, গিসিটিতে এটি কোনও সতর্কতা ছাড়াই সংকলন করে তবে জি ++ এ এটি হবে, কেন জানি না।


জিসিসি সূচিত করে ফাইলটিকে সি উত্স ফাইল হিসাবে গণ্য করে, জি ++ এটিকে সি ++ উত্স ফাইল হিসাবে বিবেচনা করুন, যদি না -x দ্বারা ওভাররাইড হয় ?? বিকল্প। সুতরাং বিভিন্ন ভাষা, সি এবং সি ++ এর কী সতর্কতা হওয়া উচিত সে সম্পর্কে সূক্ষ্ম পার্থক্য রয়েছে।
zhaorufei

0

আপনি কল করে স্ট্রিং ধ্রুবক থেকে একটি লিখনযোগ্য স্ট্রিং তৈরি করতে পারেন strdup()

উদাহরণস্বরূপ, এই কোডটি একটি সতর্কতা উত্পন্ন করে:

putenv("DEBUG=1");

তবে, নিম্নলিখিত কোডটি (এটি পাস করার আগে এটি স্তূপের স্ট্রিংয়ের একটি অনুলিপি তৈরি করে না putenv):

putenv(strdup("DEBUG=1"));

এক্ষেত্রে (এবং সম্ভবত বেশিরভাগ ক্ষেত্রে) সতর্কতা বন্ধ করা একটি খারাপ ধারণা - এটি একটি কারণ রয়েছে। অন্যান্য বিকল্প (ডিফল্টরূপে সমস্ত স্ট্রিং লিখনযোগ্য) তৈরি করা সম্ভাব্য অক্ষম।

সংকলক আপনাকে কী বলছে শুনুন!


6
এবং এটি সেই লিখনযোগ্য স্ট্রিংয়ের জন্য বরাদ্দ হওয়া মেমরিটিও ফাঁস করে দেয়।
আরবার্টেইগ

1
হ্যাঁ এটি করে - এটি উদ্দেশ্য হিসাবে। উপরের মত ওয়ান-টাইম (যেমন, আরম্ভ) কোড নিয়ে কোনও সমস্যা নেই। অথবা, আপনি নিজেই মেমরি পরিচালনা করতে এবং এটি শেষ হয়ে গেলে এটি প্রকাশ করতে পারেন।
বিলআথএইচআরএসটি

1
এর বিশেষ ক্ষেত্রেটি putenv()ভরাট - এটি উদাহরণের মতো ভাল পছন্দ নয় (কমপক্ষে, putenv()এই উত্তরের চেয়ে যা কিছু করে তা নিয়ে বেশি আলোচনা না করে)। এটি সম্পূর্ণ আলাদা আলোচনা (নোট করুন যে POSIX putenv()সংজ্ঞায়নের আগে থেকেই উত্তরাধিকার বাস্তবায়নের উপর ভিত্তি করে আচরণের জন্য POSIX স্পেসিফিকেশন সমস্যাযুক্ত)) আইআইআরসি, GNU সি লাইব্রেরির সাম্প্রতিক (এই সহস্রাব্দ) প্রকাশের মধ্যে একটি বাগ ছিল যা putenv()আচরণ পরিবর্তনের সাথে সম্পর্কিত ছিল , এবং ফিরে পরিবর্তন হচ্ছে।)
জোনাথন লেফলার

0

g ++ এর জন্য কেবলমাত্র -W বিকল্পটি ব্যবহার করুন

উদাহরণ:

g ++ -w -o সরল.o সরল কোড .পিপিথ্রড

মনে রাখবেন এটি অবচয়কে এড়িয়ে চলে না বরং এটি টার্মিনালে সতর্কতা বার্তা প্রদর্শন করা বাধা দেয়।

এখন আপনি যদি সত্যিই অবমূল্যায়ন এড়াতে চান তবে কনস্ট কীওয়ার্ডটি ব্যবহার করুন:

const char* s="constant string";  

0

-Wno-deprecatedঅবহেলিত সতর্কতা বার্তাগুলি উপেক্ষা করার বিকল্পটি আপনি কেন ব্যবহার করবেন না ?


0

এখনই সমস্যাটি হ'ল আমি-ওয়াররারের সাথে চলছি

আইএমও এটি আপনার আসল সমস্যা। আপনি (চর *) থেকে (কনস্টের চর *) এ যাওয়ার কিছু স্বয়ংক্রিয় পদ্ধতি চেষ্টা করতে পারেন তবে আমি কেবল কাজ না করে অর্থ উপার্জন করব। কমপক্ষে কিছু কাজের জন্য আপনাকে একজন মানুষের জড়িত থাকতে হবে। সংক্ষিপ্ত সময়ের জন্য, কেবল সতর্কতাটিকে উপেক্ষা করুন (তবে আইএমও এটি ছেড়ে দেয়, বা এটি কখনই স্থির হবে না) এবং কেবল-ওয়ারারটি সরিয়ে ফেলুন।


9
কারণ মানুষ ব্যবহার -Werror যে সতর্কবার্তা তাই হয় না নির্দিষ্ট দেখায়। অন্যথায় তারা কখনই স্থির হয় না।
ঝ্যান লিংস

2
লোকেরা-ওয়ারার ব্যবহার করার কারণ হ'ল তারা কেবল খেলনা প্রকল্পগুলিতে কাজ করেছে বা তারা মস্কোবাদী। আপনার 100k + এলওসি থাকা অবস্থায় জিসিসি আপডেটের কারণে আপনার কোডটি তৈরি করতে ব্যর্থ হওয়া একটি আসল সমস্যা। Dito। বিরক্তিকর সতর্কতাগুলি থেকে মুক্তি পাওয়ার জন্য কেউ "উইন্ডো-রাইটিং-স্ট্রিং" এর মতো জাঙ্ক যুক্ত করছেন (এই পোস্টে সর্বাধিক রেট দেওয়া মন্তব্যটির মতো)।
জেমস অ্যান্টিল

2
এই বিষয়ে স্পষ্ট মতানৈক্য রয়েছে, উদাহরণস্বরূপ প্রোগ্রামার
জোও পোর্তেলা

3
@ জেমস: আপনি একটি আকর্ষণীয় বিষয় তৈরি করেছেন, তবে আরও ভাল উপায় হতে পারে। সতর্কবাণীগুলি অবিলম্বে ঠিক না করা অর্থহীন বলে মনে হয় - আপনি যখন পুরানো সমস্ত সতর্কতাগুলি সরিয়ে না রেখে নতুন কোড একটি নতুন সতর্কতা শুরু করেছে তখন আপনি কীভাবে চিনবেন? আমার অভিজ্ঞতায়, এটি কেবলমাত্র লোকদের সতর্কবার্তা উপেক্ষা করার দিকে পরিচালিত করে যে তারা এড়ানো উচিত নয়।
নভেম্বর

2
@ জেমস: আমাদের খেলনা প্রকল্পটি 1.5 + এম এলওসি (বহু ভাষা)। নোবার যেমন বলেছিল, -অররফ এমন সতর্কতাগুলি এড়িয়ে চলেন যা যা হওয়া উচিত নয় এবং হ্যাঁ, প্রতিবার সংকলকের একটি নতুন সংস্করণ উঠলে আমাদের অবশ্যই অবশ্যই পুনরায় পরীক্ষা করা উচিত। -নু রাইটিং-স্ট্রিংগুলি কেবলমাত্র ফাইল পদ্ধতিতে একটি ফাইলে পাইথন মোড়কের জন্য বুস্ট ব্যবহার করার সময় ব্যবহৃত হয়, কারণ আমরা বুস্টকে পুনরায় লিখতে যাচ্ছি না (এবং এখন, 2017 এ, আমরা বুস্টের পরিবর্তে সি ++ 11 / ব্যবহার আর পছন্দ করি না cython)। উপেক্ষা করা প্রতিটি সতর্কবার্তা অবশ্যই পর্যায়ক্রমে গুণমানের চেক দ্বারা পর্যালোচনা করে দেখতে হবে যে তারা এখন কোড দ্বারা এড়ানো যায় বা এটি এখনও সম্ভব না হয় কিনা।
এমএসএন

0

সাহায্যের জন্য সবাইকে ধন্যবাদ. এখান থেকে বাছাই করা এই সমাধানটি আসে। এটি পরিষ্কার সংকলন। কোডটি এখনও পরীক্ষা করে নি। আগামীকাল হয়তো...

const char * timeServer[] = { "pool.ntp.org" }; // 0 - Worldwide 
#define WHICH_NTP            0 // Which NTP server name to use.
...
sendNTPpacket(const_cast<char*>(timeServer[WHICH_NTP])); // send an NTP packet to a server
...
void sendNTPpacket(char* address) { code }

আমি জানি, টাইম সার্ভার অ্যারেতে কেবল 1 টি আইটেম রয়েছে। তবে আরও কিছু হতে পারে। বাকীগুলি এখনই স্মৃতি সংরক্ষণের জন্য মন্তব্য করা হয়েছিল।


-1
PyTypeObject PyDict_Type=
{ ...

PyTypeObject PyDict_Type=
{
  PyObject_HEAD_INIT(&PyType_Type),
                     "dict",
                     dict_print,
                     0,
                     0
}; 

নাম ক্ষেত্রটি দেখুন, গিসিটিতে এটি কোনও সতর্কতা ছাড়াই সংকলন করে তবে জি ++ এ এটি হবে, কেন জানি না।

ইন gcc (Compiling C), -নো-রাইটিং-স্ট্রিংগুলি ডিফল্টরূপে সক্রিয়।

ইন g++ (Compiling C++)-রাইট-স্ট্রিংগুলি ডিফল্টরূপে সক্রিয় থাকে

এ কারণেই এখানে আলাদা আচরণ রয়েছে। আমাদের জন্য ম্যাক্রোগুলির ব্যবহার Boost_pythonযেমন সতর্কতা উত্পন্ন করে। আমরা -Wno-write-stringsসি ++ সংকলন করার সময় ব্যবহার করি যেহেতু আমরা সর্বদা ব্যবহার করি-Werror


-1

স্ট্রিংটিকে constসমস্যা হিসাবে সমাধান করবে হিসাবে ঘোষণা করুন :

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