2016-11-13 13 views
2

A char * (и квалифицированные варианты) могут быть псевдонимом. Есть signed char * и unsigned char * (и их квалифицированные варианты) освобождены от этого?Псевдонимы с символом char *, unsigned char * и подписанным символом *

Другими словами, я узнал, что это хорошая идея, чтобы применить restrict к char* аргументы функции, если я не ожидаю их псевдонимов параметров указателя других типов (потому что они могут их псевдоним):

int func(struct foo *f, char * restrict s /*different object*/); 

Могу ли я отбросить ключевое слово restrict для вариантов с подписью и без знака?

int sfunc(struct foo *f, signed char *s /*different object*/); 
int ufunc(struct foo *f, unsigned char *s /*different object*/); 

Также могут указатели на подписанные и неподписанные варианта одного и того же типа псевдоним друг друга? Другими словами, если я ожидаю указатель на int и указатель на unsigned, и они должны указывать на разные объекты, должны ли параметрыи unsigned * быть restrict -qualified?

/* i and u should be different */ 
int uifunc(int * /*restrict?*/ i, unsigned * /*restrict?*/ u); 
+2

Примечание: «Ограничить» в прототипе не имеет значения (хотя он служит в документации) - только версия в определении функции имеет эффект –

ответ

3

Правило (С11 6,5/7):

Объект должен иметь свое сохраненное значение доступно только именующее выражение, имеющие один из следующих типов:

  • тип, совместимый с эффективным типом объекта,
  • квалифицированная версия типа, совместимая с эффективным типом объекта,
  • типа, который является знаком или без знака типа, соответствующего эффективного типа объекта,
  • типа, который является знак или без знака типа, соответствующего квалифицированного версии эффективного типа объекта,
  • агрегата или который включает один из вышеупомянутых типов среди его членов (включая рекурсивно, член субагрегата или содержащегося объединения) или
  • тип символа.

char, signed char и unsigned char все типы символов (реф: 6.2.5/15). Более ранние пули также отвечают на ваш вопрос о типах, подписанных и неподписанных.

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

+0

Отличный ответ. Благодаря! – PSkocik

 Смежные вопросы

  • Нет связанных вопросов^_^