모든 포장 const char*
다음 코드에서와 같이 괄호 한 쌍하면 문제를 해결해야한다 :
static const char* const stateNames[5] =
{
("Init state"),
("Run state"),
("Pause state") //comma missing
("Pause state3"),
("Error state")
};
쉼표를 잊어 버린 경우 다음과 유사한 컴파일 오류가 발생합니다. error: called object is not a function or function pointer
라이브 데모
실제로 쉼표를 잊어 버린 경우 C는 실제로 다음 쉼표 또는 배열 끝까지 두 개 이상의 문자열을 연결합니다. 예를 들어 다음과 같이 쉼표를 잊어 버렸다고 가정 해 봅시다.
static const char* const stateNames[] =
{
"Init state",
"Run state",
"Pause state" //comma missing
"Pause state3" //comma missing
"Error state"
};
int main(void)
{
printf("%s\n", stateNames[0]);
return 0;
}
이것이 gcc-9.2
생성하는 것입니다 (다른 컴파일러는 비슷한 코드를 생성합니다).
.LC0:
.string "Init state"
.string "Run state"
.string "Pause statePause state3Error state" ; oooops look what happened
.quad .LC0
.quad .LC1
.quad .LC2
main:
push rbp
mov rbp, rsp
mov eax, OFFSET FLAT:.LC0
mov rdi, rax
call puts
mov eax, 0
pop rbp
ret
마지막 세 문자열이 연결되고 배열이 예상 한 길이가 아닌 것이 분명합니다.