Определение значения структуры в ее объявлении в заголовочном файле - PullRequest
1 голос
/ 13 августа 2010

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

, поэтому у меня есть файл заголовка, который объявляет такую ​​структуру

typedef struct{

    float *float_array1;

    float *float_array2;

    int anInt;

    int anotherInt;

}IMAStruct;

IMAStruct aStruct;

Я бы хотел, чтобы anInt всегда инициализировался в 0объявлена ​​структура, мем для массивов с плавающей запятой распределяется в зависимости от того, равен ли он 1 или 0;

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

Ответы [ 4 ]

1 голос
/ 13 августа 2010

Это не та вещь, которую вы должны делать в заголовке.

Проблема в том, что объявление структуры не выполняет никакого кода. Для вызова malloc или создания условной ветви требуется выполнить код.

Теперь вы можете заставить это произойти в любом случае в GCC, объявив такую ​​функцию:

void initAStruct __attribute__((init)) {
    aStruct.anInt = 0;
    aStruct.float_array2 = (float*)malloc(sizeof(float)*10);
}

В C99 я думаю, что это можно сделать с помощью float float_array2[anInt*10];, но в C89 этого нельзя.

0 голосов
/ 14 августа 2010

Просто инициализируйте его везде, независимо от того, находится ли он в области действия файла или функции следующим образом:

IMAStruct aStruct = { 0 };

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

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

0 голосов
/ 13 августа 2010

Если структура определена в области видимости файла, то есть вне какой-либо функции (или в функции, если она static,), то она всегда инициализируется одинаково: целые поля и поля с плавающей запятой инициализируются равными 0, и поля указателя инициализируются в NULL (это применяется рекурсивно к вложенным структурам и объединениям).

Если структура определена в функции («в стеке» или выделена «в куче» с помощью malloc), поля не инициализируются автоматически, и они начинаются с содержания любого случайного мусора, который был в эти биты памяти заранее.

Нет переносимого способа указать код инициализации программы; если вам нужно что-то запустить при запуске вашей программы, вы должны поместить это в main. Однако некоторые платформы предоставляют непереносимые расширения для этого.

0 голосов
/ 13 августа 2010

Я не совсем уверен, что вы хотите, но так как это C, а не C ++, вам нужно написать функцию для инициализации ваших структур так, как вы хотите.В C нет способа указать, что каждый экземпляр структуры начинается с определенной инициализации.Вы можете определить постоянный инициализатор (как макрос) и потребовать, чтобы все пользователи структуры инициализировали его этим, но он не будет работать, когда вам нужно динамическое выделение.

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