Принудительно вычислять время компиляции C - PullRequest
0 голосов
/ 22 сентября 2018

Допустим, у меня есть файл, в котором я делаю некоторые вычисления по некоторым данным.Это может быть (очень пседо-расчеты) так:

void hash_value(unsigned char* value){
    unsigned char i;
    for(i + 0; i < 10; i++){
        value[i] ^= (0x1b+i)
    }
}

void break_value(unsigned char* value){
    unsigned char i;
    for(i = 0; i < 10; i++)
        value[i] &= 0x82;
}

void affect_value(unsigned char* value){
    hash_value(value);
    break_value(value);
}

В моем основном я бы сделал следующее:

#include "smart_calculations.h"

int main() {
    unsigned char value[16] = {'S', 'S', 'S', 'S', 'S', 'S', 'S', 'S', 'S', 'S', 'S', 'S', 'S', 'S', 'S', 'S'};
    affect_value(value);
    // Do other stuff

}

Так как я не собираюсь изменять содержимоемассив значений, но мне нужно сделать вычисления, прежде чем я смогу продолжать делать другие вещи.Я предполагаю, что некоторые компиляторы распознают и оптимизируют код так, чтобы данные вычислялись во время компиляции.

Мой вопрос состоит в том, как заставить (как можно лучше) заставить компилятор выполнить эту оптимизацию во время компиляции, что методы в файле "Smart_calculations" не теряют место в конечном продукте, а начальные значения массива не компилируются в программу?

1 Ответ

0 голосов
/ 22 сентября 2018

Самый простой, самый общий метод - сделать постановку вручную.То есть, запустите код, который выполняет предварительные вычисления явно во время фазы сборки и скомпилируйте результаты только в вашу программу.

Если вы хотите сделать все это в C, вы должны создать smart_calculations.cс функцией main.Сначала вы должны скомпилировать smart_calculations исполняемый файл, который выдает

unsigned char value[16] = { ... };

в качестве вывода.Поместите этот вывод в файл, например, smart_generated.h.

Ваша настоящая программа будет либо #include этот файл:

int main() {
    #include "smart_generated.h"  // 'value' is now a local variable
    // Do other stuff    
}

... или (если вы хотите глобальную переменнуювместо этого) вы бы поместили сгенерированные результаты в файл .c и связали его с вашей программой.

Конечно, при таком подходе вы не ограничены выполнением «умных вычислений» в C. Вы можетеиспользуйте любой язык программирования или среду, доступную во время сборки.

...