จะกำจัด `การแปลงที่เลิกใช้งานแล้วจากค่าคงที่สตริงเป็น 'char *' 'คำเตือนใน GCC ได้อย่างไร


409

ดังนั้นฉันกำลังทำงานกับ codebase ขนาดใหญ่เหลือเกินและเพิ่งอัพเกรดเป็น gcc 4.3 ซึ่งตอนนี้เป็นต้นเหตุของคำเตือนนี้:

คำเตือน: การแปลงที่ไม่สนับสนุนจากค่าคงที่สตริงเป็น 'char *'

เห็นได้ชัดว่าวิธีที่ถูกต้องในการแก้ไขปัญหานี้คือการค้นหาประกาศทั้งหมดเช่น

char *s = "constant string";

หรือฟังก์ชั่นการโทรเช่น:

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

และทำให้เป็นพconst charอยน์เตอร์ อย่างไรก็ตามนั่นหมายถึงการสัมผัสไฟล์ 564 ขั้นต่ำซึ่งไม่ใช่งานที่ฉันต้องการจะทำในเวลานี้ ปัญหาตอนนี้คือฉันกำลังทำงานด้วย-werrorดังนั้นฉันต้องการวิธีที่จะยับยั้งคำเตือนเหล่านี้ ฉันจะทำสิ่งนั้นได้อย่างไร


เมื่อคุณเข้ามาแทนที่แท็ก 554 บรรทัด Sed เป็นเพื่อนที่ดี ให้แน่ใจว่าคุณสำรองข้อมูลก่อน
แมตต์

2
ฉันดูที่การอภิปรายเกี่ยวกับวิธีการระงับข้อความแสดงข้อผิดพลาดและการเปลี่ยนที่ถูกต้องควรเป็นอย่างไร ฉันไม่มีความคิดเห็นใด ๆ เกี่ยวกับเรื่องนั้น อย่างไรก็ตามฉันคิดว่าแมตต์กำลังติดตามอยู่ กำหนดสิ่งที่คุณต้องการแทนที่ด้วยอะไร คุณเพียงแค่ต้องการแสดงออกปกติที่เหมาะสม ทำการเปลี่ยนแปลงในสำเนา ใช้ "diff" เพื่อเปรียบเทียบกับต้นฉบับ การเปลี่ยนแปลงโดยใช้ sed ทำได้อย่างรวดเร็วง่ายและฟรีและความแตกต่างก็รวดเร็วง่ายและฟรี ลองใช้และดูว่าคุณต้องตรวจสอบการเปลี่ยนแปลงกี่ครั้ง โพสต์สิ่งที่คุณต้องการแทนที่ด้วยอะไรและให้ผู้ใช้แนะนำการแทนที่ regex
โทมัสเฮดเดน

การอภิปรายทั้งหมดหายไปจากจุดที่เหตุนี้เป็นปัญหาที่ต้องแก้ไขทั้งหมดตามคำเตือน gcc เหตุผลก็คือเดวิด Schwartz' คำตอบstackoverflow.com/questions/56522654/...
andig

คำตอบ:


227

ฉันเชื่อว่าการส่งผ่าน-Wno-write-stringsไปยัง gcc จะระงับคำเตือนนี้


6
มันสามารถปิดการใช้งานในแต่ละไฟล์พื้นฐานโดยใช้ pragmas
Priyank Bolia

18
@PriyankBolia bdonlan แสดงความคิดเห็นกับคำตอบของ Rob Walker ว่าสามารถใช้งาน#pragma GCC diagnostic ignored "-Wwrite-strings"ได้
MasterMastic

9
ยกเว้นถ้าคุณควบคุม API ซึ่งในกรณีนี้ @ John คำตอบด้านล่างเกี่ยวกับการเปลี่ยนลายเซ็นเพื่อยอมรับ const char * นั้นถูกต้องมากขึ้น
jcwenger

215
นี่คือการปฏิบัติที่ไม่ดีและฉันเสียใจที่ได้รับคะแนนเสียงทั้งหมดเหล่านั้น คำเตือนไม่ได้อยู่ที่นั่นเพื่อที่คุณจะไม่สนใจมัน คำเตือนกำลังบอกคุณว่า "เพื่อนคุณกำลังทำสิ่งที่อาจผิดระวัง" และคุณควรระงับเมื่อคุณต้องการตอบสนองเช่น "หุบปากฉันรู้ว่าฉันกำลังทำอะไร" ซึ่งเป็นไปได้มากที่สุด ไม่ใช่กรณีที่มีโปรแกรมเมอร์สำหรับทารก
นักฟิสิกส์ควอนตัม

9
ฉันเห็นด้วยคุณไม่ควรกำจัดคำเตือนและใช้วิธีแก้ปัญหาของ John แทน น่าเสียดายที่คำตอบนี้ได้รับการยอมรับ!
Jérôme

563

ฟังก์ชั่นใด ๆ ที่คุณผ่านตัวอักษรของสตริง"I am a string literal"ควรใช้เป็นชนิดแทนchar const *char*

หากคุณกำลังจะแก้ไขบางอย่างให้แก้ไขให้ถูกต้อง

คำอธิบาย:

คุณไม่สามารถใช้ตัวอักษรของสตริงเพื่อ initialise 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
แม้ว่านี่จะเป็นความจริงคุณไม่สามารถควบคุม API ของบุคคลที่สามซึ่งอาจใช้char */ ไม่ถูกต้องconst char *เสมอไปดังนั้นในกรณีนี้ปกติฉันจะส่ง
ideasman42

15
@ppumkin แต่น่าเสียดายที่ฟังก์ชั่นสตริงไลบรารีมาตรฐาน C จำนวนมากใช้อาร์กิวเมนต์เช่นเดียวchar*กับสตริงที่จะไม่ถูกแก้ไข หากคุณใช้พารามิเตอร์เป็น a char const*และส่งผ่านไปยังฟังก์ชันมาตรฐานที่char*คุณจะได้รับ constหากฟังก์ชั่นห้องสมุดจะไม่ได้รับการจัดการสตริงคุณอาจโยนออกไป
จอห์น

เพียงเพราะไม่สามารถทำได้เสมอไปไม่ได้หมายความว่าไม่ใช่ตัวเลือกที่ต้องการสำหรับหลาย ๆ ครั้งที่คำเตือนนี้ปรากฏในรหัสการผลิตทั่วไป
LovesTha

1
ตอนนี้ฉันเข้าใจการแก้ปัญหาและการทำงานของตัวอักษรสตริง แต่บางทีคนอื่นทำไม่ได้ดังนั้นฉัน 'จำเป็นต้องมีคำอธิบาย
NicoBerrogorry

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
@elcuco คุณจะเสนออะไร ฉันไม่สามารถแก้ไข foo ได้และพยายามค้นหาวิธีแก้ไขที่ไม่ต้องการการเตือน ในกรณีของฉันหลังเป็นเรื่องของการออกกำลังกายมากขึ้น แต่สำหรับโปสเตอร์ต้นฉบับมันดูมีความสำคัญ เท่าที่ฉันสามารถบอกได้คำตอบของฉันเป็นเพียงคำตอบเดียวที่จะแก้ไขทั้งเงื่อนไขของฉันและ OP ในเวลาเดียวกันดังนั้นมันอาจเป็นคำตอบที่มีค่าสำหรับใครบางคน หากคุณคิดว่าวิธีแก้ปัญหาของฉันไม่ดีพอคุณช่วยเลือกทางเลือกอื่นได้หรือไม่? (ที่ไม่รวมการแก้ไข foo หรือไม่สนใจคำเตือน.)
BlackShift

ถ้าเราสมมติว่า foo นั้นถูกเขียนโค้ดอย่างถูกต้อง (ซึ่งน่าเสียดายที่ไม่เป็นเช่นนั้นสำหรับรหัส 'Josh Matthews' กำลังพูดถึง) นี่เป็นทางออกที่ดีที่สุด นั่นเป็นเพราะถ้าฟังก์ชั่นต้องการเปลี่ยนสตริง 'msg' ที่ผ่านไปจริงสตริงคงที่จะทำลายโค้ดใช่ไหม แต่อย่างไรก็ตามสิ่งนี้ดูเหมือนจะไม่ตอบคำถามเพราะมีข้อผิดพลาดอยู่ในรหัสเก่าไม่ใช่ของใหม่ดังนั้นเขาจะต้องเปลี่ยนรหัสเก่าอยู่ดี
João Portela

นั่นคือวิธีที่ฉันใช้เช่นกัน และถ้าใครบางคนกำลังค้นหาสิ่งนี้สำหรับกรณีของchar **ในPyArg_ParseTupleAndKeywordsฉันทำอะไรเช่นนี้:static char kw[][16] = {"mode", "name", "ip", "port"}; static char * kwlist[] = {kw[0], kw[1], kw[2], kw[3], NULL};
254 dashesy dashesy

@elcuco: ฉันไม่แน่ใจว่า C ++ static array ทำงานอย่างไร นี่จะเป็นการคัดลอกข้อมูลจริง ๆ หรือไม่
อเล็กซานเด Malakhov

ในขณะที่วิธีการนี้อาจมีข้อดีในบางกรณีการใช้วิธีสุ่มสี่สุ่มห้านั้น IMO มีแนวโน้มที่จะทำอันตรายมากกว่าดี การประยุกต์ใช้สิ่งนี้สุ่มสี่สุ่มห้าอาจนำไปสู่การชี้พุง นอกจากนี้ยังจะขยายโค้ดที่มีการคัดลอกสตริงที่ไม่มีจุดหมาย
plugwash

69

ตรวจสอบการสนับสนุนPragmaของ gcc และรายการตัวเลือกคำเตือน -W (เปลี่ยน: ลิงก์ใหม่ไปยังตัวเลือกคำเตือน )

สำหรับ GCC คุณสามารถใช้#pragma warningคำสั่งเช่นอธิบายที่นี่


54
มันไม่จริง: #pragma GCC วินิจฉัยละเว้น "-Wwrite สตริง"
bdonlan

30

หากเป็นฐานรหัสที่ใช้งานอยู่คุณอาจยังต้องการอัพเกรดฐานรหัส แน่นอนว่าการดำเนินการเปลี่ยนแปลงด้วยตนเองนั้นเป็นไปไม่ได้ แต่ฉันเชื่อว่าปัญหานี้สามารถแก้ไขได้เพียงครั้งเดียวและโดยsedคำสั่งเดียวทั้งหมด อย่างไรก็ตามฉันยังไม่ได้ลองเลยลองทำตามด้วยเกลือเม็ดหนึ่ง

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

นี่อาจไม่พบสถานที่ทั้งหมด (แม้จะไม่ได้พิจารณาการเรียกใช้ฟังก์ชัน) แต่มันจะช่วยบรรเทาปัญหาและทำให้สามารถทำการเปลี่ยนแปลงที่เหลือด้วยตนเองได้สองสามอย่าง


7
ที่ไม่เพียง แต่แก้คำเตือนประกาศและไม่ได้ฟังก์ชั่นการโทร +1 สำหรับฟู sed อยู่แล้ว: p
João Portela

25

ฉันไม่สามารถใช้สวิตช์คอมไพเลอร์ ดังนั้นฉันได้เปิดสิ่งนี้:

char *setf = tigetstr("setf");

สำหรับสิ่งนี้:

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

1
+1 - คุณไม่สามารถเปลี่ยนแอปพลิเคชัน lvalue ได้เท่านั้น สิ่งนี้พิสูจน์แล้วว่าได้แก้ไขปัญหาที่แท้จริง อื่น ๆ เพียงแก้ไขปัญหาบางอย่างกับคอมไพเลอร์
elcuco

1
สิ่งที่น่ารำคาญจริง ๆ ก็คือ tigetstr () ควรจะเป็นต้นแบบกับ (const char *) ไม่ใช่ a (char *)
vy32

2
เมื่อฉันทำสิ่งนี้ฉันจะได้รับ "คำเตือน: คัดลอกจากประเภท 'const char *' เป็นพิมพ์ 'char *' ปลดเปลื้องความไม่มั่นคง" แทน ฉันต้องใช้ const_cast เพื่อกำจัดคำเตือนทั้งหมด: const_cast <char *> ("setf")
CrouZ

2
ฉันคิดว่า const cast เป็นโซลูชันแรกที่ยอมรับได้ในหน้านี้ (ยกเว้นการเปลี่ยนแปลง API)
rwst

25

นี่คือวิธีทำแบบอินไลน์ในไฟล์ดังนั้นคุณไม่ต้องแก้ไข Makefile ของคุณ

// 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


7

Test stringเป็นสตริง const ดังนั้นคุณสามารถแก้ปัญหาเช่นนี้:

char str[] = "Test string";

หรือ:

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



1

ใน C ++ แทนที่:

char *str = "hello";

ด้วย:

std::string str ("hello");

และถ้าคุณต้องการเปรียบเทียบ:

str.compare("HALLO");

1

ฉันไม่เข้าใจวิธีใช้โซลูชันของคุณ :( - kalmanIsAGameChanger

ทำงานกับ Arduino Sketch ฉันมีฟังก์ชั่นที่ทำให้เกิดคำเตือนของฉัน

ฟังก์ชั่นดั้งเดิม: ถ่าน StrContains (ถ่าน * str, ถ่าน * sfind)

เพื่อหยุดการเตือนฉันเพิ่มconstหน้า char * str และ char * sfind

แก้ไขแล้ว: char StrContains (const char * str, const char * sfind)

คำเตือนทั้งหมดหายไป


นี่คือคำตอบที่ถูกต้องตามคำเตือนที่ถูกพูด: "คำเตือน: การแปลงที่เลิกใช้แล้วจากค่าคงที่ของสตริงเป็น 'char *'"
Norbert Boros

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
};

ดูฟิลด์ชื่อใน gcc มันคอมไพล์โดยไม่มีการเตือน แต่ใน g ++ มันจะฉันไม่รู้ว่าทำไม


gcc หมายถึงถือว่าไฟล์เป็นไฟล์ต้นฉบับ C, g ++ ถือว่าเป็นไฟล์ต้นฉบับ c ++ เว้นแต่จะมีการแทนที่ด้วย -x ?? ตัวเลือก ภาษาที่แตกต่างดังนั้น c และ c ++ มีความแตกต่างเล็กน้อยเกี่ยวกับสิ่งที่ควรเตือน
zhaorufei

0

strdup()นอกจากนี้คุณยังสามารถสร้างสตริงเขียนได้จากค่าคงที่สตริงโดยการเรียก

ตัวอย่างเช่นรหัสนี้สร้างคำเตือน:

putenv("DEBUG=1");

อย่างไรก็ตามรหัสต่อไปนี้ไม่ได้ (มันทำสำเนาของสตริงบนฮีปก่อนส่งผ่านไปputenv):

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

ในกรณีนี้ (และในคนอื่น ๆ ส่วนใหญ่) การปิดคำเตือนเป็นความคิดที่ไม่ดี - มันมีเหตุผล ทางเลือกอื่น ๆ (การทำให้สตริงทั้งหมดเขียนได้โดยค่าเริ่มต้น) อาจไม่มีประสิทธิภาพ

ฟังสิ่งที่คอมไพเลอร์บอกคุณ!


6
และยังรั่วหน่วยความจำที่จัดสรรสำหรับสตริงที่เขียนได้นั้น
RBerteig

1
ใช่แล้ว - นั่นคือจุดประสงค์ ไม่มีปัญหากับโค้ดแบบครั้งเดียว (เช่นการกำหนดค่าเริ่มต้น) ดังกล่าวข้างต้น หรือคุณสามารถจัดการหน่วยความจำด้วยตัวคุณเองและปล่อยมันเมื่อคุณทำเสร็จแล้ว
BillAtHRST

1
กรณีเฉพาะของputenv()เต็มไปด้วย - มันไม่ใช่ทางเลือกที่ดีของตัวอย่าง (อย่างน้อยก็ไม่ใช่โดยไม่มีการอภิปรายเพิ่มเติมเกี่ยวกับสิ่งที่putenv()ทำมากกว่าที่มีอยู่ในคำตอบนี้) เป็นการสนทนาที่แยกต่างหากทั้งหมด (โปรดทราบว่าข้อกำหนด POSIX สำหรับพฤติกรรมของputenv()เป็นปัญหาขึ้นอยู่กับการใช้งานแบบดั้งเดิมจากก่อนที่จะกำหนด POSIX) IIRC มีข้อผิดพลาดในการเปิดตัว GNU C Library ล่าสุดที่เกี่ยวข้องกับputenv()การเปลี่ยนแปลงพฤติกรรม และถูกเปลี่ยนกลับ)
Jonathan Leffler

0

เพียงใช้ตัวเลือก -w สำหรับ g ++

ตัวอย่าง:

g ++ -w -o simple.o simple.cpp -lpthread

โปรดจำไว้ว่านี่จะไม่หลีกเลี่ยงการเลิกใช้ แต่เป็นการป้องกันไม่ให้แสดงข้อความเตือนบนเครื่อง

ตอนนี้ถ้าคุณต้องการหลีกเลี่ยงการเลิกใช้คำหลัก const แบบนี้:

const char* s="constant string";  

0

ทำไมคุณไม่ใช้-Wno-deprecatedตัวเลือกเพื่อละเว้นข้อความเตือนที่เลิกใช้แล้ว


0

ปัญหาตอนนี้คือฉันกำลังทำงานกับ -Werror

นี่คือปัญหาที่แท้จริงของคุณ IMO คุณสามารถลองใช้วิธีอัตโนมัติในการย้ายจาก (char *) เป็น (const char *) แต่ฉันจะนำเงินมาให้พวกเขาไม่ใช่แค่ทำงาน คุณจะต้องมีมนุษย์ที่เกี่ยวข้องกับงานอย่างน้อยบางส่วน สำหรับระยะสั้นเพียงเพิกเฉยต่อคำเตือน (แต่ IMO จะเปิดทิ้งไว้ไม่เช่นนั้นจะไม่มีการแก้ไข) และเพียงแค่ลบ -Werror


9
เหตุผลที่คนใช้ -Werror เพื่อให้คำเตือนไม่ได้รับการแก้ไข มิฉะนั้นพวกเขาจะไม่ได้รับการแก้ไข
Zan Lynx

2
เหตุผลที่ผู้คนใช้ -Werror ก็เพราะพวกเขาทำงานในโครงการของเล่นเท่านั้น การมีรหัสของคุณไม่สามารถสร้างได้เนื่องจากการอัปเดต GCC เป็นปัญหาจริงเมื่อคุณมี 100k + LOC Dito บางคนเพิ่มขยะเช่น "-Wno-write-strings" ในงานสร้างเพื่อกำจัดคำเตือนที่น่ารำคาญ (เช่นความคิดเห็นที่มีอันดับสูงสุดในบทความนี้แนะนำ)
James Antill

2
มีความขัดแย้งที่ชัดเจนในหัวข้อนั้นเช่นprogrammer.97things.oreilly.com/wiki/index.php/
......

3
@ James: คุณสร้างประเด็นที่น่าสนใจ แต่ต้องมีวิธีที่ดีกว่า ดูเหมือนว่าไม่มีประโยชน์ที่จะไม่แก้ไขคำเตือนทันที - คุณจะจำได้อย่างไรว่าเมื่อรหัสใหม่เรียกใช้คำเตือนใหม่เมื่อคุณไม่ได้ลบคำเตือนเก่าทั้งหมดออก จากประสบการณ์ของฉันนั่นทำให้คนไม่สนใจคำเตือนว่าพวกเขาไม่ควรเพิกเฉย
nobar

2
@ James: โครงการของเล่นของเราคือ 1.5 + M LOC (หลายภาษา) ดังที่ขุนนางกล่าวว่า - ผู้ดูแลหลีกเลี่ยงการเพิกเฉยต่อคำเตือนที่ไม่ควรใช่ใช่ทุกครั้งที่คอมไพเลอร์เวอร์ชั่นใหม่เพิ่มขึ้นเราต้องตรวจสอบใหม่ทั้งหมด -Wno-write-strings ถูกใช้เมื่อใช้ Boost สำหรับ python wrappers ในไฟล์ตามลักษณะไฟล์เพราะเราจะไม่เขียน Boost อีกครั้ง (และในตอนนี้ 2017 เราไม่ต้องการใช้ Boost อีกต่อไป แต่ C ++ 11 / Cython) แต่ละคำเตือนที่ถูกละเว้นจะต้องได้รับการตรวจสอบโดยการตรวจสอบคุณภาพเป็นระยะเพื่อดูว่าตอนนี้สามารถหลีกเลี่ยงได้ด้วยรหัสหรือไม่หรือยังเป็นไปไม่ได้
msn

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 รายการในอาร์เรย์ timeServer แต่อาจมีมากกว่านี้ ที่เหลือถูกคอมเม้นท์ตอนนี้เพื่อบันทึกความทรงจำ


-1
PyTypeObject PyDict_Type=
{ ...

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

ดูฟิลด์ชื่อใน gcc มันคอมไพล์โดยไม่มีการเตือน แต่ใน g ++ มันจะฉันไม่รู้ว่าทำไม

ในgcc (Compiling C)- ไม่เขียนสตริงใช้งานโดยค่าเริ่มต้น

ในg++ (Compiling C++)-Wwrite-strings มีการใช้งานโดยค่าเริ่มต้น

นี่คือสาเหตุที่มีพฤติกรรมแตกต่างกัน สำหรับเราที่ใช้มาโครการBoost_pythonสร้างคำเตือนดังกล่าว ดังนั้นเราจึงใช้-Wno-write-stringsเมื่อรวบรวม C ++ เนื่องจากเราใช้เสมอ-Werror


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.