Перейти к содержанию
    

Как в IAR C++ положить константу по адресу?

Добрый, всем, день.

 

Мне нужно в коде на С++ положить во флешку по определнному адресу, заданному на этапе компиляции, некоторую константную структуру данных - блок параметров.

 

Пока удалось сделать только так:

parameters.h

typedef struct
{ 
  ...
} tParameters;

#ifndef __PARAMETERS__
extern const tParameters* Parameters;
#endif

 

И Parameters.cpp:

#define     __PARAMETERS__
#include "Parameters.h"
static const tParameters Param @ "CFG_SEG" = {...};
const tParameters* Parameters = &Param;

 

В таком виде это работает, но хочется сделать это одной переменной. Т.е. я не могу написать такое extern описание для переменной Param чтобы в любом другом месте кода использовать конструкцию Param.SomeField.

 

Я прекрасно понимаю, что в моем случае обращение вида Parameters->SomeField, в плане скорости и расхода памяти, нисколько не хуже чем Param.SomeField, просто хочется узнать, где мы с компилятором друг друга не поняли :07:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...попробуйте вот так

 

parameters.h

#ifndef __PARAMETERS__
#define     __PARAMETERS__

typedef struct
{ 
  ...
} tParameters;

extern const tParameters Parameters;

#endif

 

И Parameters.cpp:

#include "Parameters.h"

const tParameters Parameters @ "CFG_SEG" = {...};

 

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо большое. Так заработало:

parameters.h

typedef struct
{ 
  ...
} tParameters;

extern const tParameters Param;

 

И Parameters.cpp:

#include "Parameters.h"
const tParameters Param @ "CFG_SEG" = {...};

 

Получается, что после препроцессора, в Parameters.cpp будет примерно такой код:

extern const tParameters Param;
const tParameters Param @ "CFG_SEG" = {...};

 

Я думал это вызовет конфликт объявлений, но именно это и помогло. А почему? :07:

 

А насчет static я и сам уже нашел, что область видимости сужается до одного файла.

 

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

1.cpp:

//extern const int A;
const int A = 1;

 

main.cpp:

#include <stdio.h>

extern const int A;

int main()
{
    printf("A = %d\n", A);
    return 0;
}

 

Компиляция этого маленького проекта на GCC (равно как и в ИАРе) вываливается на этапе линковки с ошибкой

main.cpp:(.text+0x18): undefined reference to `A'

Но стоит раскоментарить строчку с extern в файле 1.cpp и все начинает работать!!! :cranky:

 

Если эти же файлы откомпилировать как ANSI-C то все работает и без непонятного extern в 1.cpp

Кто может объяснить, что происходит?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если эти же файлы откомпилировать как ANSI-C то все работает и без непонятного extern в 1.cpp

Кто может объяснить, что происходит?

C и C++ отличаются в области видимости констант. В С константы глобальные по умолчанию, в С++ они глобальные, если объявлены с extern. В С++ объявление константы без extern эквивалентно объявлению в С константы с ключевым словом static. Это позволяет С++ встраивать значение константы в точке использования и в общем случае обойтись без выделения памяти под константу. Поэтому в С++ возможно использование интегральной константы как размерности массива, например. Так что все правильно делают ваши компиляторы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

C и C++ отличаются в области видимости констант. В С константы глобальные по умолчанию, в С++ они глобальные, если объявлены с extern. В С++ объявление константы без extern эквивалентно объявлению в С константы с ключевым словом static. Это позволяет С++ встраивать значение константы в точке использования и в общем случае обойтись без выделения памяти под константу. Поэтому в С++ возможно использование интегральной константы как размерности массива, например. Так что все правильно делают ваши компиляторы.

 

Спасибо огромное! :beer:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Получается, что после препроцессора, в Parameters.cpp будет примерно такой код:

extern const tParameters Param;
const tParameters Param @ "CFG_SEG" = {...};

 

Я думал это вызовет конфликт объявлений, но именно это и помогло. А почему? :07:

 

 

...да так и получается. И нет ничего удивительного в том что это работает. Просто первая строка это объявление переменной (означает что где-то существует такой объект), а вторая это определение переменной (т.е объект вот с таким именем и такого типа есть здесь).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...