다중 문자 상수 경고
왜 경고인가?'의미 없다'는 숫자 대신 다차 int 상수를 사용하거나, 같은 값을 가진 등수 변수를 정의하는 대신 다차 int 상수를 사용하는 것이 보다 명확한 경우가 많다고 생각한다.파형/티프/기타 파일 형식을 구문 분석할 때 읽기 값을 해당 값 대신 일부 'EVAW', '데이터' 등과 비교하는 것이 더 명확하다.
샘플 코드:
int waveHeader = 'EVAW';
왜 이것이 경고를 주는가?
표준에 따름 (제6.4.4.4/10조)
둘 이상의 문자(예: 'ab'), [...]를 포함하는 정수 문자 상수의 값은 구현 정의되어 있다.
long x = '\xde\xad\xbe\xef'; // yes, single quotes
이것은 유효한 ISO 9899:2011 C이다.다음과 같이 사전 경고 없이 컴파일된다.gcc
와 함께-Wall
, 및 "다문자 상수" 경고:-pedantic
.
위키백과에서:
다문자 상수(예: 'xy')는 거의 유용하지 않지만 유효하다. 즉, 정수에 여러 문자를 저장할 수 있다(예: ASCII 문자 4자, 32비트 정수에 8자, 64비트 정수에 8자).문자가 하나의 int로 포장되는 순서가 정해져 있지 않기 때문에 다문자 상수를 휴대용으로 사용하기 어렵다.
휴대성을 위해 정수 유형이 포함된 다중 문자 상수를 사용하지 마십시오.
이 경고는 실수로 글을 쓰는 프로그래머들에게 유용하다.'test'
그들이 썼어야 할 곳에."test"
.
이것은 실제로 다당체 상수를 원하는 프로그래머들보다 훨씬 더 자주 일어난다.
@leftaround에 의해 위에서 언급된 가장 단순한 C/C++ 컴파일러/표준 준수 솔루션이 다음과 같은 코멘트에서 언급되었다.
int x = *(int*)"abcd";
좀 더 구체적으로 말하자면:
int x = *(int32_t*)"abcd";
C99 이후 C/C++ 컴파일러/표준을 준수하는 솔루션 하나 더(버그가 알려진 clang++ 제외:
int x = ((union {char s[5]; int number;}){"abcd"}).number;
/* just a demo check: */
printf("x=%d stored %s byte first\n", x, x==0x61626364 ? "MSB":"LSB");
여기서 익명 결합은 원하는 숫자 결과에 멋진 기호 이름을 주기 위해 사용되며, "abcd" 문자열은 복합 리터럴(C99)의 lvalue를 초기화하기 위해 사용된다.
만약 당신이 당신이 무엇을 하고 있는지 알고 휴대성 문제를 받아들일 수 있다면, 예를 들어 GCC에서 명령행에서 경고를 해제할 수 있다.
-Wno-multichar
너와 비슷한 이유로 나는 AVI와 MP4 파일 헤더로 작동하는 내 앱에 이것을 사용한다.
구현이 정의하는 동작에 대해 기꺼이 찾아보려고 해도 다중 문자 상수는 엔디안성에 따라 여전히 달라질 것이다.
(POD) 구조 { char[4] }; ...을 사용한 다음 "WAVE"_4cc와 같은 UDL을 사용하여 해당 클래스의 인스턴스를 쉽게 구성하십시오.
이 경고를 비활성화하려면 GCC와 클랑에 두 가지 관련 경고 매개 변수, 즉 GCC 컴파일러 옵션 -wno-4char 및 -wno-multichar가 있는지 알아야 한다.
참조URL: https://stackoverflow.com/questions/7755202/multi-character-constant-warnings
'Programing' 카테고리의 다른 글
단일 방법을 사용하는 클래스 - 최상의 접근 방식? (0) | 2022.04.25 |
---|---|
VueJs - $ref에서 요소의 DOM 속성에 액세스하는 방법 (0) | 2022.04.25 |
Java의 foreach 루프에서 remove 호출 (0) | 2022.04.25 |
Mac에 Java 8을 설치하는 방법 (0) | 2022.04.25 |
MathicalException: "비단수 소수점 확장, 정확한 표현 가능한 소수점 결과 없음" (0) | 2022.04.25 |