Самое большое в мире счастье - это счастье человеческого общения...
Всем понятно, что тема топика перетерта до дыр...
Это где там попытка переопределить const?Neekeetos писал(а): ...Проблема в const которую пытаются переопределить...
Не путайте uchar const* var (или const uchar* var - что одно и тоже) и uchar* const var...Neekeetos писал(а): unsigned char const - это должно быть таким const unsigned char...
Там и нет дела до указателя - он не константа. Константой объявлена переменная, на которую указывает указатель. Стандартный прием, дабы ненароком не повредить данные. Что касается передачи копии - для одного байта выгоды в использовании указателя может и немного, но гораздо чаще приходится передавать значительные объемы данных, когда передача через копии отнимает слишком много памяти. Опять же - привычка...Neekeetos писал(а): ...вообще говоря в чем смысл такой махинации с конст неясен, в функцию передается указатель на байт, учитывая что этот указатель создается специально для функции никому не важно меняется он или нет, тоже самое касается случая когда аргумент - просто переменная - создается копия до которой никому кроме самой функции нету дела...
Предельно понятныйNeekeetos писал(а): ...Сам код непонятный...
Так в чем же некорректность объявления? Или MVS+ 2005 уже не авторитет?... А K&R?То что у него компилятор не отловил некорректное объявление типа аргумента просто связано с тем что С для пиков это глюкодром, думаю если по нему судить то многие нелегальные по стандарту конструкции кода сработают
Neekeetos писал(а):РадиоЛоматель писал(а):Microsoft Visual С++:
...Проблема в const которую пытаются переопределить...
Neekeetos писал(а):РадиоЛоматель писал(а):Microsoft Visual С++:
unsigned char const - это должно быть таким const unsigned char...
Neekeetos писал(а):РадиоЛоматель писал(а):Microsoft Visual С++:
...Сам код непонятный...
Проехали, ошибка компилятора это одно конст это другое.Goodefine писал(а):Это где там попытка переопределить const?Neekeetos писал(а): ...Проблема в const которую пытаются переопределить...
Указатель на константу определяется в единственно возможной форме "const uchar* var" вот так, а вариант с uchar const * var неверный, можно написать uchar * const var это будет константный указатель. Формат использования const такой - const T или Т const, где Т это тип переменной, целиком.Goodefine писал(а):Не путайте uchar const* var (или const uchar* var - что одно и тоже) и uchar* const var...Neekeetos писал(а): unsigned char const - это должно быть таким const unsigned char...
на сколько я могу перевести, это означает следующее:The type designated as ‘‘float *’’ has type ‘‘pointer to float’’. Its type category is pointer, not a floating type. The const-qualified version of this type is designated as ‘‘float * const’’ whereas the type designated as ‘‘const float *’’ is not a qualified type — its type is ‘‘pointer to const-qualified float’’ and is a pointer to a qualified type.
таким образом, имеем:Тип, определенный как "float *" есть "указатель на float". Это тип категории "указатель", но не "float". Константный вариант этого типа определяется как "float * const", в то время как "const float *" не является константным указателем - это тип "указатель на константу float".
Вот что по этому поводу пишет Страуструп: Поспорите с автором С++?...Neekeetos писал(а): Указатель на константу определяется в единственно возможной форме "const uchar* var" вот так, а вариант с uchar const * var неверный...
Про страуструпа могу сказать одно, для своих примеров он использует какую то жутко редкую модификацию компилятора не больно стандартную, собственно некоторые примеры из его книжки не работают в гнутом компиляторе. Сама книжка довольно стара, стандарт си свежее. Я ответил на твой вопрос/упрек?Goodefine писал(а):Вот что по этому поводу пишет Страуструп: Поспорите с автором С++?...
Начнем с того, что я никого не упрекал. Но имею желание узнать - где запрещено объявлять указатель на константу как uchar const* data. Или, хотя бы, предупреждение какого-то ни было мало-мальски приличного компилятора (MVS, GCC...). Пока ни того ни другого не было названо...Neekeetos писал(а):...Я ответил на твой вопрос/упрек?
Тебе ARV привел кусок из актуального стандарта С где нету варианта с конст посреди типа. У гнутого компилятора есть ключик разрешающий предупреждения если код не подходит под стандарт, включи , узнаешь много нового.Goodefine писал(а):Начнем с того, что я никого не упрекал. Но имею желание узнать - где запрещено объявлять указатель на константу как uchar const* data. Или, хотя бы, предупреждение какого-то ни было мало-мальски приличного компилятора (MVS, GCC...). Пока ни того ни другого не было названо...Neekeetos писал(а):...Я ответил на твой вопрос/упрек?
Ну и что с того что нет? Много чего можно написать, чего нет в стандарте в качестве примера.. Все что не запрещено - разрешено.Neekeetos писал(а):...Тебе ARV привел кусок из актуального стандарта С где нету варианта с конст посреди типа...
Да неужели узнаю? Вам, как знатоку ключиков компилятора, наверняка не составит труда на тестовом примере показать ошибку (или предупреждение хотя-бы), которую выдаст компилятор при таком объявлении. Иначе, при всем уважении, разговоры насчет ключиков и стандарта, просто треп...Neekeetos писал(а):... У гнутого компилятора есть ключик разрешающий предупреждения если код не подходит под стандарт, включи , узнаешь много нового.
Ну не всегда так - в стандарте часто как раз пишется то, что разрешено.Goodefine писал(а):Ну и что с того что нет? Много чего можно написать, чего нет в стандарте в качестве примера.. Все что не запрещено - разрешено.Neekeetos писал(а):...Тебе ARV привел кусок из актуального стандарта С где нету варианта с конст посреди типа...
Это opt означает, что обозначаемая словом вещь опциональна, может отсутствовать.A.2.2 Declarations
(6.7) declaration:
declaration-specifiers init-declarator-listopt ;
(6.7) declaration-specifiers:
storage-class-specifier declaration-specifiersopt
type-specifier declaration-specifiersopt
type-qualifier declaration-specifiersopt
function-specifier declaration-specifiersopt
Итого short, unsigned, int - равноправные слова, любое из них являетя спецификатором типа, порядок спецификаторов в declaration specifiers неопределён. Ну и до кучи список возможных квалификаторов.(6.7.2) type-specifier:
void
char
short
int
long
float
double
signed
unsigned
_Bool
_Complex
_Imaginary
struct-or-union-specifier
enum-specifier
typedef-name
Исходя из процитированного я смею сдлать вывод, что стандарт C99 явно разрешает такие записи(6.7.3) type-qualifier:
const
restrict
volatile
Код: Выделить всё
volatile i = 1; // int by default
const j = 2; // int by default
int short const unsigned volatile u = 3;
void foo() {
while( u == 3 );
}Код: Выделить всё
.text
.global foo
.type foo, @function
foo:
/* prologue: function */
/* frame size = 0 */
lds r24,u
lds r25,(u)+1
.L2:
cpi r24,3
cpc r25,__zero_reg__
breq .L2
/* epilogue start */
ret
.size foo, .-foo
.global i
.data
.type i, @object
.size i, 2
i:
.word 1
.global j
.type j, @object
.size j, 2
j:
.word 2
.global u
.type u, @object
.size u, 2
u:
.word 3Очень удивлюсь, если увижу компилятор, которыйNeekeetos писал(а):нету варианта с конст посреди типа
иconst int i;
const char * p;
воспринимает по разному либо не воспринимает вторую форму вообще.int const i;
char const * p;
Ну включил.Neekeetos писал(а):У гнутого компилятора есть ключик разрешающий предупреждения если код не подходит под стандарт, включи , узнаешь много нового.
Ну и что он написал? Все верно типы и модификаторы могут располагаться в произвольном порядке, так что я ошибался утверждая обратноеavreal писал(а):Ну включил.Neekeetos писал(а):У гнутого компилятора есть ключик разрешающий предупреждения если код не подходит под стандарт, включи , узнаешь много нового.
Вся его выдача по --ansi --pedanitc по поводу расставленных произвольно квалификаторов и спецификатров процитирована выше.Neekeetos писал(а):Ну и что он написал?
Это была ошибка типа "незнание", которая при желании может быть легко исправлена.Neekeetos писал(а):так что я ошибался утверждая обратное.