2017-01-04 5 views
0

Попытка определить пользовательский тип я наткнулся на ошибку, я не совсем понимаю: следующий код работает отличноОпределяется тип не распознается инициализации указателя

const int a[5] = { 1, 2, 3, 4, 5 }; 

typedef const int costant; 

costant b = 5; 
costant *c = a; 

void func(const int item) 
{ 
    printf("Item: %i\n", item); 
} 

int main(void) 
{ 
    func(a[0]); 
    func(b); 
    func(*c); 
} 

Nonethe меньше, инициализирует указатель

costant *c = a[0]; 

не указал, что Initializer element is not costant. Пытаться получить доступ к адресу a[0], чтобы изменить его содержимое, с ошибкой assignment of read-only location.

Почему считается адресом массива a как const, но не его элементом a[0], даже если он «доступен только для чтения»?

Замена typedef на #define costant const int не изменяет поведение.

+3

Линия typedef не компилируется. Пожалуйста, не сообщайте о несовместимом коде. –

+0

'costant * c = &a[0];' будет работать (при условии фиксированного typedef) - потому что [0] является 'const int', а' c' является указателем на const int' –

+0

Этот код ** не * * работа хорошо. – giusti

ответ

1

В отличие от #define, который имеет синтаксис #define NEW_SYMBOL [old_symbol], синтаксис typedef является:

typedef existing_type new_type; 

Итак:

typedef const int constant; 

Действителен C, в то время как

typedef constant const int; 

Не.

+1

Вы правы, я исправил ошибку (я просто скопировал неправильно из моего редактора на другом ПК) –

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