Как я могу сделать для цикла функции #define? - PullRequest
1 голос
/ 13 июня 2019

У меня есть #define функция с аргументом, таким как DEF_GLOBAL_STRUCT(index), и мне нужно вызывать этот макрос от 1 до 100. Каков наилучший способ? Могу ли я использовать for loop?

Я сделал простой код, чтобы показать мою проблему.

#include <stdio.h>
#include <stdint.h>

#define DEF_GLOBAL_STRUCT(index)    uint8_t m_##index##_size=2; \
    uint32_t m_##index##_data1=0; \
    uint32_t m_##index##_data2=0;

DEF_GLOBAL_STRUCT(1)
DEF_GLOBAL_STRUCT(2)
DEF_GLOBAL_STRUCT(3)
// ...
DEF_GLOBAL_STRUCT(100)

int main()
{
    printf("%u\n", m_1_size);
    return 0;
}

Вместо 100 строк вызова функции определения, я могу использовать что-то вроде for цикла. Или есть другое решение?

Если у меня есть весь контроль над кодом, я могу определить структуру и объявить ее с массивом. Но я не могу этого сделать. Мне нужно использовать этот тип определения функции. Это мое ограничение.

Ответы [ 2 ]

5 голосов
/ 13 июня 2019

Ваш вопрос спрашивает, можете ли вы смешать язык C с директивами препроцессора, чтобы автоматизировать генерацию кода с использованием директив языка C и препроцессора.

Ответ не в том, как вы пытаетесь это сделать, потому чтоо том, как работает препроцессор и компилятор C.

Препроцессор - это отдельный шаг от компиляции.Идея состоит в том, что Препроцессор выполняет шаг замены текста файла исходного кода C, чтобы сгенерировать новую временную версию файла исходного кода C, который затем компилируется компилятором C.

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

Я бы предложил написать простую программу, которая генерирует включаемый файл, содержащий список определений, которые вы хотите использовать.Затем в том месте, где вы хотите поместить эти определения, используйте директиву #include, чтобы включить ее в этот момент.

Так что если у вас есть простой скрипт или, возможно, программа на C, что-то вроде:

#include <stdio.h>

int main ()
{
    int i;
    for (i = 1; i <= 100; i++) printf ("DEF_GLOBAL_STRUCT(%d)\n", i);

    return 0;
}

Затем вы компилируете его и запускаете из командной строки, перенаправляя вывод, как в:

mygen >junk.h

, затем в место, где вам нужны эти директивы:

#include <stdio.h>
#include <stdint.h>

#define DEF_GLOBAL_STRUCT(index)    uint8_t m_##index##_size=2; \
    uint32_t m_##index##_data1=0; \
    uint32_t m_##index##_data2=0;

#include "junk.h"

int main()
{
    printf("%u\n", m_1_size);
    return 0;
}
2 голосов
/ 13 июня 2019

Вы можете сохранить набор текста, определив другой макрос:

#include <stdio.h>
#include <stdint.h>

#define DEF_GLOBAL_STRUCT(index)    uint8_t m_##index##_size=2; \
    uint32_t m_##index##_data1=0; \
    uint32_t m_##index##_data2=0;

#define DEF_GLOBAL_STRUCT_DECADE(tens) \
    DEF_GLOBAL_STRUCT(tens##0) \
    DEF_GLOBAL_STRUCT(tens##1) \
    DEF_GLOBAL_STRUCT(tens##2) \
    DEF_GLOBAL_STRUCT(tens##3) \
    DEF_GLOBAL_STRUCT(tens##4) \
    DEF_GLOBAL_STRUCT(tens##5) \
    DEF_GLOBAL_STRUCT(tens##6) \
    DEF_GLOBAL_STRUCT(tens##7) \
    DEF_GLOBAL_STRUCT(tens##8) \
    DEF_GLOBAL_STRUCT(tens##9)

DEF_GLOBAL_STRUCT(1)
DEF_GLOBAL_STRUCT(2)
DEF_GLOBAL_STRUCT(4)
DEF_GLOBAL_STRUCT(5)
DEF_GLOBAL_STRUCT(6)
DEF_GLOBAL_STRUCT(7)
DEF_GLOBAL_STRUCT(8)
DEF_GLOBAL_STRUCT(9)
DEF_GLOBAL_STRUCT_DECADE(1)
DEF_GLOBAL_STRUCT_DECADE(2)
DEF_GLOBAL_STRUCT_DECADE(3)
DEF_GLOBAL_STRUCT_DECADE(4)
DEF_GLOBAL_STRUCT_DECADE(5)
DEF_GLOBAL_STRUCT_DECADE(6)
DEF_GLOBAL_STRUCT_DECADE(7)
DEF_GLOBAL_STRUCT_DECADE(8)
DEF_GLOBAL_STRUCT_DECADE(9)
DEF_GLOBAL_STRUCT(100)

int main()
{
    printf("%u\n", m_1_size);
    return 0;
}
...