Версия "const" будет работать только тогда, когда вы передадите ей действительно указатель на строку const, поэтому вы должны либо сохранить ее в переменной указателя const, либо привести ваши литералы к "const char *" вручную. Спасибо @ Дэвид Боулинг.
протестировано с gcc.exe (i686-posix-dwarf-rev0, созданный проектом MinGW-W64) 8.1.0
включает
void put_const_msg( const char* msg )
{
printf("CONST MSG: %s\n", msg);
}
void put_non_const_msg( char* msg )
{
printf("NON CONST MSG: %s\n", msg);
}
#define put_msg(msg) _Generic((msg), \
const char*: put_const_msg, \
char*: put_non_const_msg \
)((msg))
int main ( int argc, char** argv )
{
const char* cm = "Hello there!";
char* ncm = "How are you?";
put_msg(cm);
put_msg(ncm);
put_msg("KETCHUP IS A GENERIC SAUCE!");
put_msg((char*)"MUSTARD IS LESS GENERIC!");
put_msg((const char*)"Well this is ackward!");
return 0;
}
выход
CONST MSG: Hello there!
NON CONST MSG: How are you?
NON CONST MSG: KETCHUP IS A GENERIC SAUCE!
NON CONST MSG: MUSTARD IS LESS GENERIC!
CONST MSG: Well this is ackward!