gladov 0 20 декабря, 2007 Опубликовано 20 декабря, 2007 · Жалоба Добрый, всем, день. Мне нужно в коде на С++ положить во флешку по определнному адресу, заданному на этапе компиляции, некоторую константную структуру данных - блок параметров. Пока удалось сделать только так: 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: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tag 0 20 декабря, 2007 Опубликовано 20 декабря, 2007 · Жалоба ...попробуйте вот так 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 0 20 декабря, 2007 Опубликовано 20 декабря, 2007 · Жалоба Пора уже FAQ делать http://electronix.ru/forum/index.php?showtopic=36695&hl= Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gladov 0 20 декабря, 2007 Опубликовано 20 декабря, 2007 · Жалоба Спасибо большое. Так заработало: 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 я и сам уже нашел, что область видимости сужается до одного файла. Пора уже FAQ делать http://electronix.ru/forum/index.php?showtopic=36695&hl= Я видел эту ветку, но прежде чем наезжать, вникли бы в проблему. Дело не в том, что я не знаю как разместить переменную по указанному адресу, а в том, что я не понимал (да и сейчас не понимаю) как в C++ (не С) правильно указать extern описание чтобы переменная с фиксированным адресом была видна из любого модуля. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gladov 0 20 декабря, 2007 Опубликовано 20 декабря, 2007 · Жалоба В продолжение темы был поставлен такой опыт: 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 Кто может объяснить, что происходит? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 140 20 декабря, 2007 Опубликовано 20 декабря, 2007 · Жалоба Если эти же файлы откомпилировать как ANSI-C то все работает и без непонятного extern в 1.cpp Кто может объяснить, что происходит? C и C++ отличаются в области видимости констант. В С константы глобальные по умолчанию, в С++ они глобальные, если объявлены с extern. В С++ объявление константы без extern эквивалентно объявлению в С константы с ключевым словом static. Это позволяет С++ встраивать значение константы в точке использования и в общем случае обойтись без выделения памяти под константу. Поэтому в С++ возможно использование интегральной константы как размерности массива, например. Так что все правильно делают ваши компиляторы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gladov 0 20 декабря, 2007 Опубликовано 20 декабря, 2007 · Жалоба C и C++ отличаются в области видимости констант. В С константы глобальные по умолчанию, в С++ они глобальные, если объявлены с extern. В С++ объявление константы без extern эквивалентно объявлению в С константы с ключевым словом static. Это позволяет С++ встраивать значение константы в точке использования и в общем случае обойтись без выделения памяти под константу. Поэтому в С++ возможно использование интегральной константы как размерности массива, например. Так что все правильно делают ваши компиляторы. Спасибо огромное! :beer: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tag 0 20 декабря, 2007 Опубликовано 20 декабря, 2007 · Жалоба Получается, что после препроцессора, в Parameters.cpp будет примерно такой код: extern const tParameters Param; const tParameters Param @ "CFG_SEG" = {...}; Я думал это вызовет конфликт объявлений, но именно это и помогло. А почему? :07: ...да так и получается. И нет ничего удивительного в том что это работает. Просто первая строка это объявление переменной (означает что где-то существует такой объект), а вторая это определение переменной (т.е объект вот с таким именем и такого типа есть здесь). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться