Различение const char * и char * с помощью макроса C _Generic - PullRequest
0 голосов
/ 04 ноября 2018

Я хочу, чтобы функция работала по-разному, когда параметром является const char * (например, "текст") или char * (динамически размещаемая строка).

Есть ли способ достичь этого с помощью макроса _Generic в C?

Я попробовал следующий код, но он не запустил функцию const.

Редактировать: добавлен пример

#define foo(val) _Generic((val), \
    char *: foo_string,\ 
    const char*: foo_const_string\
    )((val))

char * text = "abc";
foo(text);  //both calls foo_string(val)
foo("abc");

1 Ответ

0 голосов
/ 04 ноября 2018

Версия "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!
...