реклама на сайте
подробности

 
 
> Как в IAR C++ положить константу по адресу?
gladov
сообщение Dec 20 2007, 06:51
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 169
Регистрация: 10-11-05
Из: Воронеж
Пользователь №: 10 687



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

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

Пока удалось сделать только так:
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
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
gladov
сообщение Dec 20 2007, 12:13
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 169
Регистрация: 10-11-05
Из: Воронеж
Пользователь №: 10 687



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

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
Кто может объяснить, что происходит?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 20 2007, 13:23
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 12:39
Рейтинг@Mail.ru


Страница сгенерированна за 0.01389 секунд с 7
ELECTRONIX ©2004-2016