Постоянные типы массива в C, испортитесь в стандарте?

ПРИМЕЧАНИЕ. Обязательно отредактируйте CSS, связанный со страницей.

. Если вы хотите «отключить» значения CSS по умолчанию в тегах HTML, попробуйте проверить "reset.css" и получите представление о том, как создать новый сайт, не беспокоясь о различных отступах и полях. Также, если вы сделаете

html, body { padding: 0; margin: 0;} 

, это, скорее всего, решит эту проблему.

15
задан Jed 20 November 2008 в 13:28
поделиться

3 ответа

Это - известный вопрос, который обсуждался несколько раз за прошлые 10 лет в comp.std.c. Нижняя строка - то, что конкретный случай, который Вы представили, не в настоящее время законен в Стандарте C; необходимо или удалить спецификатор или рефрен от использования указателя на массив для обращений к квалифицированным элементам в массиве.

Если Вы думаете, что у Вас есть хорошая идея преодолеть проблему, можно отправить ее на news:comp.std.c для обсуждения. Если другие соглашаются, что это - хорошая идея, Вы, или кто-то еще может зарегистрировать дефектный отчет иметь измененное поведение (существует несколько членов комитета, которых частый comp.std.c так обратная связь от людей, которые потенциально рассмотрели бы DR, будет полезен иметь до регистрации его). Я думаю, что могут быть некоторые проблемы с Вашим предложением иметь влияние спецификаторов сам массив, но я должен был бы уделить ему еще некоторое внимание.

6
ответ дан 1 December 2019 в 05:12
поделиться

Возможное обходное решение для программиста C (но не разработчик компилятора):

gcc с -Wcast-qual не жалуется на это:

void g(const double *ap, int n)
{
    int i;
    struct box 
    {
      double a[n];
    };
    const struct box *s = (const struct box *)ap;

    for (i=0; i<n; ++i)
    {
       doStuffWith(s->a[i]);
       /* ... */
    }
}

Даже если это не очень изящно. Запаздывающий участник массива a также имеет немного отличающееся значение между C89 и C99, но по крайней мере Вы получаете намеченный эффект.

1
ответ дан 1 December 2019 в 05:12
поделиться

Положение является неловким с указателями (т.е., массивы), но здесь является моим воспоминанием о деталях:

const double *ap указатель на константу дважды;

double *const ap постоянный указатель на двойное;

const double *const ap постоянный указатель на константу дважды;

Таким образом, я полагаю, что возможно сделать то, что Вы спрашиваете, хотя я не попробовал это в течение многих лет - gcc опция, которую Вы используете, не была доступна в прошлый раз, когда я сделал это!

Править: Этот ответ не корректен для вопроса - я оставляю это, сохраняют комментарии ниже, которые разъясняют проблему для простых смертных (или ржавые разработчики C...)

0
ответ дан 1 December 2019 в 05:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: