Я настраиваю среду с помощью инструментария gcc-arm-none-eabi (в настоящее время 7.2.1). Это для встроенного устройства ARM Cortex M4.

Я бы хотел переопределить printf для всего проекта, но у меня проблемы. Я хочу использовать эту реализацию. Я установил это в проект, и я могу использовать его, например, вызывая: printf_("Test: %i",5);, и все работает, как ожидалось.

Теперь я хочу установить его как функцию printf по умолчанию. Если я раскомментирую: #define printf printf_, я получу следующую ошибку:

/home/timv/.platformio/packages/toolchain-gccarmnoneeabi@1.70201.0/arm-none-eabi/include/c++/7.2.1/cstdio:127:11: error: '::printf' has not been declared
   using ::printf;

Позже:

src/LoggerTask.cpp:62:5: error: 'printf' was not declared in this scope

В этом файле я нашел такую ​​строку:

#undef printf

Когда я закомментирую эту строку, проект строится и printf работает. Это хорошо, но я хотел бы, чтобы мой проект функционировал без исправления цепочки инструментов.

Как мне это сделать? Какая еще информация была бы полезной?

0
Tim Vrakas 17 Дек 2019 в 04:43
Вам нужно решение на C или только на C ++?
 – 
Andrew Henle
18 Дек 2019 в 14:43
Зачем вам #undef printf в своем LoggerTask.cpp? f I uncomment: #define printf printf_ - в каком файле находится это определение?
 – 
KamilCuk
18 Дек 2019 в 15:03
Переопределять стандартные имена C - плохая идея (сбивает с толку и может иметь неопределенное поведение). Разве вы не можете использовать вместо этого в исходном коде myprintf?
 – 
Basile Starynkevitch
18 Дек 2019 в 15:14

2 ответа

Вы можете создать указатель на printf, используя следующий пример. Вам необходимо создать вспомогательные файлы (в этом примере они называются «printf_helper.h» и «printf_helper.cpp»). И включите printf_helper.h ( после всех остальных включенных заголовков ) в файл, в котором вы хотите использовать printf.

Printf_helper.h:

#ifndef PRINTF_HELPER_H
#define PRINTF_HELPER_H

namespace helper {
  typedef int (*printf_t) (const char * format, ...);
  extern const printf_t printf_ptr;
}

#endif /* PRINTF_HELPER_H */

Printf_helper.cpp:

#include "printf_helper.h"
#include <cstdio>

namespace helper {
  const printf_t printf_ptr = std::printf;
}

Пример использования в main.cpp:

// all other included headers
#include "printf_helper.h"

int main() {
  helper::printf_ptr("Hello, %s!\n", "World");
  return 0;
}
1
Sergey Aleksandrovich 18 Дек 2019 в 14:40

Добавьте в свою компиляцию новый файл:

#include <stdarg.h>
int vprintf_(const char* format, va_list va);
int printf(const char *str, ...) {
     va_list va;
     va_start(va, str);
     int ret = vprintf_(str, va);
     va_end(va);
     return ret;
}

Скомпилируйте и свяжите с результирующим объектом при создании вывода компиляции. Это все. Из-за того, как работает компоновщик, компоновщик должен выбрать ваш символ, а не тот, который предоставляется newlib. В качестве альтернативы вы можете использовать опцию компоновщика --wrap=printf, чтобы просто обернуть символ.

0
KamilCuk 18 Дек 2019 в 15:09