Как мне вернуть строку из функции, которая предназначена для использования в printf в C?

Этот ответ должен быть довольно коротким и сладким, чтобы ответить (часть) озаглавленного вопроса. Если вы хотите получить более подробный ответ, объясняющий, почему вы должны их там поместить, пожалуйста, перейдите здесь .


Общее правило для размещения typename в основном, когда вы используете параметр шаблона, и хотите получить доступ к вложенному typedef или с использованием псевдонима, например:

template
struct test {
    using type = T; // no typename required
    using underlying_type = typename T::type // typename required
};

Обратите внимание, что это также относится к метафункциям или вещи, которые также принимают общие параметры шаблона. Однако, если предоставленный параметр шаблона является явным типом, вам не нужно указывать typename, например:

template
struct test {
    // typename required
    using type = typename std::conditional::type;
    // no typename required
    using integer = std::conditional::type;
};

Общие правила добавления определителя template в основном аналогичны, за исключением они обычно включают шаблонные функции-члены (статические или другие) структуры / класса, которые сами шаблоны, например:

Учитывая эту структуру и функцию:

template
struct test {
    template
    void get() const {
        std::cout << "get\n";
    }
};

template
void func(const test& t) {
    t.get(); // error
}

Попытка доступа t.get() изнутри функции приведет к ошибке:

main.cpp:13:11: error: expected primary-expression before 'int'
     t.get();
           ^
main.cpp:13:11: error: expected ';' before 'int'

Таким образом, в этом контексте вам понадобится ключевое слово template заранее и вызвать его так:

t.template get()

Таким образом, компилятор будет анализировать это правильно, а не t.get < int.

2
задан Alessandro Lorusso 1 April 2019 в 22:06
поделиться

1 ответ

Как вернуть строку из функции, которая предназначена для использования в printf в C?

В C99 или более поздней версии использовать составной литерал для временного хранения строк.

Сначала перепишите printRegister(), чтобы принять буфер char *.

#define  printRegister_N 7
// char * printRegister(int num) {
char * printRegister(char *reg, int num) {
  // char reg[] = "$error";
  // memset(reg, 0, sizeof(reg));
  memset(reg, 0, printRegister_N);  // not really needed anymore with compound literal
  ...
  return reg;
}

Сформируйте макрос, который вызывает printRegister() с составным литералом .

//                                   v---------------------------v  compound literal
#define PRINT_REG(num) printRegister((char [printRegister_N]){ 0 }, (num))

Затем позвоните PRINT_REG(num). Возвращенный char* (который является указателем на составной литерал ) действителен до конца блока. Нет *alloc(), free() необходимо.

printf("1st:%s  2nd:%s\n", PRINT_REG(0), PRINT_REG(1));

Код все еще использует обычные украшения для "%s", такие как "%-7s", "%.*s" и т. Д.

0
ответ дан chux 1 April 2019 в 22:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: