Кто-нибудь знает, почему этот код C не будет компилироваться? - PullRequest
2 голосов
/ 04 сентября 2011
#include <stdio.h>
int const NAMESIZE = 40;
int const ADDRSIZE = 80;
typedef char NameType[NAMESIZE];
typedef char AddrType[ADDRSIZE];

typedef struct
{
    NameType name;
    AddrType address;
    double salary;
    unsigned int id;
}EmpRecType;

int main(int * argc, char * argv[])
{
    EmpRecType employee;
    return 0;
}

Если я использую #define вместо const, он компилируется. это ошибка:

employee.c: 5: 14: ошибка: измененный «NameType» в области видимости файла employee.c: 6: 14: ошибка: переменно измененный 'AddrType' в области видимости файла

Ответы [ 3 ]

9 голосов
/ 04 сентября 2011

Одно из различий между C и C ++ состоит в том, что в C ++ объект const int является константой , т. Е. Его можно использовать для формирования константных выражений .В C, с другой стороны, объект const int вообще не является константой (это больше похоже на «неизменяемую переменную »).

Между тем, размер массива для массивов области видимости файла вC должен быть константным выражением , поэтому ваш const int объект не работает в этой роли.(Кстати, это означает, что ваш код будет прекрасно компилироваться как C ++, но не будет компилироваться как C).

В языке C для определения именованных констант вы должны использовать либо #define, либо перечисления.В вашем конкретном случае это можно сделать следующим образом:

#define NAMESIZE 40
#define ADDRSIZE 80

PS Если вы замените массивы файловой области на локальные массивы, ваш код C будет скомпилирован как есть, то есть с const int объектами в качестве размеров массива,потому что современный C (ANSI C99) поддерживает массивы переменной длины (VLA) в локальной области видимости.(И ваши массивы будут VLA в этом случае).В более старых версиях C (например, ANSI C89 / 90) код не будет компилироваться даже с локальными массивами.

7 голосов
/ 04 сентября 2011

Эти объявления const в C просто определяют некоторую память только для чтения, они не являются истинными константами.Они не могут быть оценены до времени выполнения, что слишком поздно для объявлений массива.

5 голосов
/ 04 сентября 2011

Хотя на вопрос был дан ответ, я думаю, вам следует перейти по этой ссылке:

Несовместимости между ISO C и ISO C ++

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...