Как заставить printf () правильно печатать двоичный блоб из макроса? - PullRequest
0 голосов
/ 24 июня 2010

В моем проекте (который по техническим причинам не должен зависеть от каких-либо внешних библиотек или сторонних источников) я настроил следующее test.h:

static int rc = 0;
#define TESTCASE( x ) if ( x ) {} \
                      else \
                      { \
                          rc += 1; \
                          printf( "FAILED: " __FILE__ ", line %d - " #x "\n", __LINE__ ); \
                      }

Это прекрасно работает в большинстве случаев.время - если тестовый набор оценивается как true, ничего не происходит.Если тестовый случай оценивается как false, тестовый случай печатается с именем файла и номером строки.

Однако, когда тестовый случай содержит строковый литерал, printf() в макросе TESTCASE настаивает на интерпретации строкового литерала как частистроки формата (которая оказалась фатальной для определенного тестового примера).

Теперь я размышляю над различными подходами, чтобы получить printf() для печати всего, что есть в x (тестовом примере) дословно, но яподойди пустым.Самым близким было использование %c для печати фиксированного числа символов и передачи текстового регистра (#x) в качестве параметра printf() - но я не мог понять, как определить размер #x,особенно если он содержит ноль байтов (что исключает любое использование strlen()).

В замешательстве и в недоумении.Помощь

1 Ответ

3 голосов
/ 24 июня 2010

как насчет использования %s в качестве формата, а затем передачи в качестве параметра строкового тестового примера, как вы это сделали для номера строки?

printf( "FAILED: %s, line %d - %s\n", __FILE__, __LINE__, #x );

# преобразует аргумент в правильно удвоенныйстрока с разделителями-кавычками, так что ничто не мешает вам передать эту строку в качестве аргумента в printf ...

(вы никогда не должны использовать любое значение, которое не является жестко заданным в качестве строки формата для printf: это поднимает ад большую частьвремя)

...