การห่อทุกอย่าง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
เป็นที่ชัดเจนว่าสตริงสามตัวสุดท้ายเรียงต่อกันและอาร์เรย์ไม่ยาวเท่าที่คุณคาดหวัง