에러가 아니고 경고입니다.
해당 경고는 무시하면 됩니다.
bfType는 short이므로 2바이트이고, 이는 문제가 없습니다.
'MB'라고 쓰는 것이나 4바이트 문자 상수로 비교하기 위해 int로 선언된 값을 'rise'라고 쓰는 것도 가능합니다.
ISO 9899:1999 C 언어 표준, 즉 C99에서 이것은 유효(valid)한 표현입니다.
해당 경고는 GCC에서 -Wall 옵션을 사용했을 때 표시됩니다.
C 언어 표준 §6.4.4.4.10절에 따르면
The value of an integer character constant containing more than one character (e.g., 'ab'), [...] is implementation-defined.
'ab'처럼 두 글자 이상의 정수 문자 상수의 값은 구현체 정의라고 되어 있습니다.
구현체에 따라 다를 수 있다는 뜻입니다.
undefined behavior는 정의되지 않은 동작이고, 구현체에 따라 동작이 다르지만, 문서화할 필요가 없지만,
implementation defined는 정의된 동작이고, 구현체에서 문서화하는 동작이라는 뜻입니다.
경고를 피하고 싶다면 2바이트 문자 상수로 취급하는 'MB' 대신에 'M'과 'B'를 직접 비교하는 코드로 바꾸면 됩니다.
static unsigned char fileHeader[] = {
0,0, /// signature
0,0,0,0, /// image file size in bytes
0,0,0,0, /// reserved
0,0,0,0, /// start of pixel array
};
fileHeader[ 0] = (unsigned char)('B');
fileHeader[ 1] = (unsigned char)('M');
fileHeader[ 2] = (unsigned char)(fileSize );
fileHeader[ 3] = (unsigned char)(fileSize >> 8);
fileHeader[ 4] = (unsigned char)(fileSize >> 16);
fileHeader[ 5] = (unsigned char)(fileSize >> 24);
fileHeader[10] = (unsigned char)(FILE_HEADER_SIZE + INFO_HEADER_SIZE);
이런 형태로 작성하는 것도 가능합니다.BITMAPFILEHEADER 구조체에서 bfType은 2바이트입니다. unsigned char로 2바이트 배열이어도 충분합니다.
unsigned char bfType[2];로 바꾸고
fileHeader.bfType[0] == 'M' && fileHeader.bfType[1] == 'B'
로 구현해도 됩니다.
VS Code는 에디터이고,
사용하는 컴파일러는 아마도 GCC 또는 CLang일 겁니다. Visual Studio에서는 경고가 없습니다.