Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как в IAR C++ положить константу по адресу?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
gladov
Добрый, всем, день.

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

Пока удалось сделать только так:
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.gif
tag
...попробуйте вот так

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, если описывать переменную используя его, то область действия переменной распространяется только на файл где она определена
vmp
Пора уже FAQ делать
http://electronix.ru/forum/index.php?showtopic=36695&hl=
gladov
Спасибо большое. Так заработало:
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.gif

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

Цитата(vmp @ Dec 20 2007, 11:10) *


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

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.gif

Если эти же файлы откомпилировать как ANSI-C то все работает и без непонятного extern в 1.cpp
Кто может объяснить, что происходит?
Сергей Борщ
Цитата(gladov @ Dec 20 2007, 14:13) *
Если эти же файлы откомпилировать как ANSI-C то все работает и без непонятного extern в 1.cpp
Кто может объяснить, что происходит?
C и C++ отличаются в области видимости констант. В С константы глобальные по умолчанию, в С++ они глобальные, если объявлены с extern. В С++ объявление константы без extern эквивалентно объявлению в С константы с ключевым словом static. Это позволяет С++ встраивать значение константы в точке использования и в общем случае обойтись без выделения памяти под константу. Поэтому в С++ возможно использование интегральной константы как размерности массива, например. Так что все правильно делают ваши компиляторы.
gladov
Цитата(Сергей Борщ @ Dec 20 2007, 16:23) *
C и C++ отличаются в области видимости констант. В С константы глобальные по умолчанию, в С++ они глобальные, если объявлены с extern. В С++ объявление константы без extern эквивалентно объявлению в С константы с ключевым словом static. Это позволяет С++ встраивать значение константы в точке использования и в общем случае обойтись без выделения памяти под константу. Поэтому в С++ возможно использование интегральной константы как размерности массива, например. Так что все правильно делают ваши компиляторы.


Спасибо огромное! beer.gif
tag
Цитата(gladov @ Dec 20 2007, 11:15) *
Получается, что после препроцессора, в Parameters.cpp будет примерно такой код:
Код
extern const tParameters Param;
const tParameters Param @ "CFG_SEG" = {...};


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



...да так и получается. И нет ничего удивительного в том что это работает. Просто первая строка это объявление переменной (означает что где-то существует такой объект), а вторая это определение переменной (т.е объект вот с таким именем и такого типа есть здесь).
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.