programing

GCC에서 "문자열 상수에서 "char*"로 사용되지 않는 변환" 경고를 제거하는 방법

bestprogram 2023. 4. 22. 10:57

GCC에서 "문자열 상수에서 "char*"로 사용되지 않는 변환" 경고를 제거하는 방법

매우 큰 코드 베이스로 작업하고 있으며, 최근 GCC 4.3으로 업그레이드하고 있습니다.이것에 의해, 다음의 경고가 트리거 됩니다.

경고: 문자열 상수에서 'char*'로의 권장되지 않는 변환

분명히, 이 문제를 해결하는 올바른 방법은 다음과 같은 모든 선언을 찾는 것입니다.

char *s = "constant string";

또는 다음과 같은 함수 호출:

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

그것을 들 them them them로 한다.const char포인터단, 최소 564개의 파일을 만지는 것을 의미합니다.이 작업은 현시점에서는 하고 싶지 않습니다.현재 문제는 -Werror로 실행 중이기 때문에 이러한 경고를 억제할 수 있는 방법이 필요하다는 것입니다.내가 어떻게 그럴 수 있을까?

리터럴을 "I am a string literal" 사용해야 한다char const * of of of of of 가 아닌 char*.

고칠 게 있으면 제대로 고쳐라.

설명:

할 수 .는 스트링 리터럴이 입니다. 이치노const char*. 그것들을 나중에 수정하기 위해 항상성을 버리는 것은 정의되지 않은 행동이기 때문에 당신은 그것을 복사해야 합니다.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;
}

GCC에 -Wno-write-string을 전달하면 이 경고가 억제된다고 생각합니다.

저도 비슷한 문제가 있어서 이렇게 해결했어요.

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

할 수 .const char*가 foo를 바꾸지 때문에 더이 될 m.

GCC의 Diagnostic Pragma 지원 및 -W 경고 옵션 목록을 확인하십시오.

의 경우는, GCC 의 「」를 사용할 수 .#pragma warning여기에 설명된 지시사항을 참조하십시오.

액티브한 코드 베이스의 경우는, 코드 베이스의 업그레이드를 실시할 필요가 있습니다.하지만, 이 문제는 한 이 될 수 합니다.sed명령어를 입력합니다.하지만 먹어본 적은 없으니, 다음 것을 참고하세요.

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

이것에 의해, 모든 장소가 검출되는 것은 아닙니다(함수 호출을 고려하지 않는 경우도 있습니다).다만, 문제를 경감해, 나머지 몇개의 변경을 수동으로 실행할 수 있게 됩니다.

Make file을 수정할 필요가 없기 때문에 파일에서 인라인으로 하는 방법은 다음과 같습니다.

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

그럼 나중에...

#pragma GCC diagnostic pop

컴파일러 스위치를 사용할 수 없습니다.그래서 이걸 돌렸습니다.

char *setf = tigetstr("setf");

다음과 같이 입력합니다.

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

교체하다

char *str = "hello";

와 함께

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

또는 함수를 호출하는 경우:

foo("hello");

이것을 로 대체하다

foo((char*) "hello");

대신:

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

이 방법은 다음과 같습니다.

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

에서는, C++ 를 합니다.const_cast와 같이

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

Test string stringconst string 입니다.을 사용하다

char str[] = "Test string";

또는 다음과 같이 입력합니다.

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

활자 주조만 사용:

(char*) "test"

상수 문자열에서 문자 포인터로 타이핑합니다.

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

C++에서 다음을 바꿉니다.

char *str = "hello";

포함:

std::string str ("hello");

비교하고 싶은 경우:

str.compare("HALLO");

귀사의 솔루션을 어떻게 적용해야 할지 모르겠습니다. ( – kalmanIs )AGame Changer

Arduino 스케치를 작업하면서 경고를 유발하는 기능이 있었습니다.

원래 기능:

char StrContains(char *str, char *sfind)

경고를 멈추기 위해 char *str과 char *sfind 앞에 const를 추가했습니다.

수정 완료:

char StrContains(const char *str, const char *sfind).

모든 경고가 사라졌다.

가능한 할 수도 있습니다.이 경우 를 호출합니다.strdup().

예를 들어, 이 코드는 경고를 생성합니다.

putenv("DEBUG=1");

다음 한 후 ,, 음, 음, (, 음, 음, 히, 히, 히, 히, 히, however, however에 전달합니다).putenv

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

이 경우(그리고 다른 대부분의 경우) 경고를 끄는 것은 좋지 않습니다. 이유가 있기 때문입니다.다른 방법(기본적으로 모든 문자열을 쓰기 가능으로 설정)은 비효율적일 수 있습니다.

컴파일러가 말하는 것을 들어라!

사용되지 않는 경고 메시지를 무시하려면 -Wno-decommended 옵션을 사용합니다.

-w 옵션을 사용하면 됩니다.g++.

예:

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

이것이 비난을 피할 수 없다는 것을 기억하라.오히려 단말기에 경고 메시지가 표시되지 않도록 합니다.

여기서 굳이 권고를 회피하려면 다음과 같이 const 키워드를 사용합니다.

const char* s = "constant string";  

여기저기서 고르면 이 해결책이 나온다.이것은 깨끗한 컴파일입니다.

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 }

timeServer 어레이에 항목이 하나밖에 없다는 것을 알고 있습니다.하지만 더 있을 수도 있어나머지는 일단 메모리의 절약을 위해 코멘트를 달았다.

문자열 상수를 함수에 전달할 때 다음과 같이 적습니다.

void setpart(const char name[]);

setpart("Hello");

const char name[] 라고 쓸 도 있어요.const char \*name.

이 에러를 해소할 수 있었습니다.

[Warning] deprecated conversion from string constant to 'char*' [-Wwrite-strings]

현재 문제는 -Werror를 실행하고 있다는 것입니다.

이게 당신 진짜 문제예요, IMO. 당신은 (char *)에서 (const char *)로 자동 이동하는 방법을 시도해 볼 수 있지만, 저는 그냥 작동하지 않는 것에 돈을 걸겠습니다.적어도 일부 작업은 사람이 참여해야 합니다.단기적으로는 경고를 무시하고(IMO를 켜놓지 않으면 수정되지 않음) -Werror만 제거합니다.

이 상황을 참조해 주세요.

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++그것은 그럴거다.왜인지 모르겠다.

Re Shindow의 "답변":

PyTypeObject PyDict_Type=
{
    ...

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

이름 필드를 확인합니다.사용.gcc, 경고 없이 컴파일 합니다만,g++그것은 그럴거다.왜인지 모르겠다.

gcc(컴파일 C)에서는 디폴트로 -Wno-write-strings가 활성화 되어 있습니다.

g++(컴파일 C++)에서는, 디폴트로 -Write-strings 가 액티브하게 됩니다.

이것이 다른 행동이 있는 이유이다.

델의 경우,Boost_python는 이러한 경고를 생성합니다.따라서 C++를 컴파일할 때는 항상 -Werror를 사용하기 때문에 -Wno-write-string을 사용합니다.

언급URL : https://stackoverflow.com/questions/59670/how-to-get-rid-of-deprecated-conversion-from-string-constant-to-char-warnin