С помощью const в C какие проблемы с портированием это может вызвать? - PullRequest
4 голосов
/ 17 июня 2011

Я хотел бы использовать 'const' в функциях интерфейса C, чтобы заметить, что некоторые аргументы char * не модифицируются функцией.

Какие проблемы могут возникнуть при переносе этого кода на различные платформы?Является ли поддержка const в коде C довольно стандартной?Когда это стало официально в стандарте C?

Ответы [ 6 ]

6 голосов
/ 17 июня 2011

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

#define const

где-нибудь в общий заголовочный файл, чтобы все ключевые слова const исчезли.Семантика времени выполнения вашей программы не изменится вообще (поскольку ваш компилятор все равно не поддерживает ключевое слово).

3 голосов
/ 17 июня 2011

Он работает в MSVC, что является самым большим препятствием, которое необходимо преодолеть с помощью переносимости C.

3 голосов
/ 17 июня 2011

Это довольно стандартно.Я думаю, что это пришло с C89.

1 голос
/ 18 июня 2011

Реализация может поместить объект const, который не является энергозависимым, в область хранения, доступную только для чтения.

(WG14 / N1336 сек. 6.7.3, сноска 117)

Некоторые (кросс) компиляторы странно по этому поводу;они обрабатывают неконстантные переменные как те, которые должны быть помещены в ОЗУ, а константные переменные - как те, которые должны быть помещены в реальное постоянное запоминающее устройство (EEPROM или Flash)

Вы запуститев таких случаях возникают проблемы, так как тип * и тип const * будут ссылаться на разные области памяти.

Учтите:

void foo(const char* arg); /* intent is not to modify anything through arg, but arg refers to a memory location in ROM */
/* ... */
char bar[] = "abc";
const char baz[] = "def";
foo(bar);  /* behavior is undefined! */
foo(baz);  /* should be ok */

Мне не известен компилятор на базе ПК, которыйэто, но это кажется распространенным в кросс-компиляторах микроконтроллеров.Недавно я столкнулся с этой проблемой при портировании FatFs на компилятор ImageCraft для PSoC1, и мне пришлось # определять константы, как предложил Карл.

1 голос
/ 17 июня 2011

Как говорят другие ответы, const является стандартным.Единственные проблемы, с которыми вы столкнетесь, - это неправильное использование.Указатель const может быть хитрым.Убедитесь, что вы используете правильную вещь:

См. Статью в Википедии о правильности const:

Для типов указателей и ссылок синтаксис немного более тонкий.Указатель может быть объявлен как константный указатель или указатель на константный объект (или оба).Указатель const нельзя переназначить, чтобы он указывал на объект, отличный от того, которому он был изначально назначен, но его можно использовать для изменения объекта, на который он указывает (называемого "pointee").Таким образом, ссылочные переменные являются альтернативным синтаксисом для константных указателей.С другой стороны, указатель на const-объект может быть переназначен для указания на другой объект того же типа или преобразуемого типа, но его нельзя использовать для изменения какого-либо объекта.Константный указатель на константный объект также может быть объявлен и не может использоваться ни для изменения указателя, ни для переназначения для указания на другой объект.Следующий код иллюстрирует эти тонкости:

void Foo( int       *       ptr,
      int const *       ptrToConst,
      int       * const constPtr,
      int const * const constPtrToConst )
{
*ptr = 0; // OK: modifies the pointee
ptr  = 0; // OK: modifies the pointer

*ptrToConst = 0; // Error! Cannot modify the pointee
ptrToConst  = 0; // OK: modifies the pointer

*constPtr = 0; // OK: modifies the pointee
constPtr  = 0; // Error! Cannot modify the pointer

*constPtrToConst = 0; // Error! Cannot modify the pointee
constPtrToConst  = 0; // Error! Cannot modify the pointer
}
1 голос
/ 17 июня 2011

Практически любой современный компилятор должен правильно обрабатывать const.Популярный выбор определенно поддержит это.Это стандарт в C89, IIRC.

...