Распечатать статически выделенное содержимое массива во время компиляции - PullRequest
0 голосов
/ 09 июля 2020

В C, можно ли распечатать (во время компиляции) содержимое статически определенного массива, если включение различных элементов массива определяется #define значениями?

Я видел много вопросы о #pragma message (кажется полезным), но ни одного о том, как делать то, что я пытаюсь сделать (хотя я могу искать не то).

Вот то, что я пытаюсь выполнить sh :

Я работаю с большой сторонней библиотекой с открытым исходным кодом, которая (среди прочего) включает большой массив информации, для которой содержимое массива никогда не изменяется, а длина массива определяется тем, не (тонны и тонны) символов препроцессора определены. Мне нужно иметь возможность печатать ВО ВРЕМЯ КОМПИЛЯЦИИ то, что содержит массив.

Вот очень небольшая программа, чтобы показать суть того, что я получаю:

#include "stdlib.h"
#include "stdio.h"

// there are tons of these, some of which are conditionally defined based on tons of other defines. 
// All are defined in other header files and none are defined via the command line, i.e. via `-DTHREE`.
#define ONE
#define TWO
// ...

int main()
{
  int values[] = {
#ifdef ONE
  1,
#endif
#ifdef TWO
  2,
#endif
#ifdef THREE
  3,
#endif
#ifdef FOUR
  4,
#endif
#ifdef FIVE
  5,
#endif
  0
  };
  int i = 0;

  for (i = 0; values[i] != 0; i++)
  {
    printf("values[%d] = %d\n", i, values[i]);
  }
  return 0;
}

Очевидно, если я скомпилирую этот код (с gcc) и запустил , то я получу результат:

values[0] = 1
values[1] = 3

Однако я хочу знать, что значения 1 и 3 присутствуют в массиве во время компиляции . Чтобы быть ясным, меня не волнует, есть ли какое-либо конкретное значение в массиве; Я только хочу знать, что на самом деле находится в массиве , без необходимости запускать двоичный . В идеале мой рабочий процесс должен был бы заключаться в компиляции кода и поиске на выходе специально отформатированных сообщений, которые сообщали бы мне, что содержится в массиве. Код всегда должен компилироваться, так как я хотел, чтобы добавленная диагностика сообщала мне о двоичном файле, не препятствуя его компиляции, если он что-то включает или не включает.

Я пытался сделать следующее:

  • Используйте #pragma message. Примерно так:
  // ...
#ifdef ONE
#pragma message "1 is included"
  1,
#endif
  // ...

Это вызывает ошибки компиляции (error: expected expression before '#pragma')

  • Используйте #warning. Примерно так:
  // ...
#ifdef ONE
#warning "1 is included"
  1,
#endif
  // ...

Это работает очень хорошо но , как только я использую -Werror (что мне нужно), компиляция завершается неудачно.

Любые мысли о том, как выполнить sh, это было бы здорово.

ОБНОВЛЕНИЕ / УТОЧНЕНИЕ: в моем простом примере, #ifdef охранники вокруг включения каждого элемента просто проверяют один условное обозначение. Это не отражает фактический код; Фактическая защита препроцессора кода проверяет множество, много, много символов, чтобы определить, следует ли включать один элемент массива или нет. По существу, для меня нецелесообразно проверять список символов, чтобы определить, что находится в списке, поскольку мне фактически пришлось бы дублировать сложные проверки символов препроцессора.

Ответы [ 2 ]

1 голос
/ 09 июля 2020

Типичное использование директивы message - отображение информационных сообщений во время компиляции. но вы забываете ( ) в прагматическом массаже ..... просто используйте вот так #pragma message("1 is included") для получения дополнительной информации см. vc ++ message pragma

0 голосов
/ 13 июля 2020

Мне пришлось «заставить что-то работать», поэтому я сделал следующее:

Я написал python скрипт, который анализировал бы файл, содержащий гигантский массив, с помощью #if defined(...) logi c в нем и сгенерировать идентично структурированный блок кода #ifdef, который вместо определения элементов массива будет использовать #pragma message для вывода информации об элементе, который включается в массив.

Это сгенерированное протоколирование препроцессора было затем добавлен в исходный файл над определением массива с ОЧЕНЬ заметным комментарием о том, что это такое и как его восстановить в случае, если определение массива когда-либо изменилось.

В идеале я бы интегрировал python script в мою систему сборки, чтобы код ведения журнала автоматически регенерировался, чтобы он никогда не выходил из синхронизации c с определением массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...