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++
그것은 그럴거다.왜인지 모르겠다.
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
'programing' 카테고리의 다른 글
"NODE_ENV"는 내부 또는 외부 명령어, 작동 가능한 명령어 또는 배치 파일로 인식되지 않습니다. (0) | 2023.04.22 |
---|---|
SQL에서 union과 함께 주문하려면 어떻게 해야 합니까? (0) | 2023.04.22 |
url 내의 double excape sequence : 요구 필터링 모듈은 이중 이스케이프 시퀀스를 포함하는 요구를 거부하도록 설정됩니다. (0) | 2023.04.22 |
matplotlib 범례 추가 (0) | 2023.04.22 |
숫자에서 0을 제거하는 중 (0) | 2023.04.22 |