Может приспосабливание C реализация #define ПУСТОЙ УКАЗАТЕЛЬ, чтобы быть чем-то дурацким

В '{{ (path('change_todo_status', {'todo_id': todoId})) }}' ветка ожидает переменную ветки. У меня уже была эта проблема, и я использовал замену в javascript для замены.

В примере:

let todoId = cb.getAttribute('data-id');
/*
 * this will generate a path with ReplaceMeWithCorrectValue instead of the correct value.
 * You have to use a placeholder that correspond to the restrictions defined in your route.
 */
let url = "{{ (path('change_todo_status', {'todo_id': 'ReplaceMeWithCorrectValue'})) }}";

url = url.replace("ReplaceMeWithCorrectValue", todoId);

А затем, в вашем Ajax:

$.ajax({
        url: url,
   // the remain of your code
26
задан Community 23 May 2017 в 11:47
поделиться

4 ответа

В стандарте C99 в п. 7.17.3 говорится, что NULL «расширяется до определенной в реализации константы нулевого указателя ». Между тем, §6.3.2.3.3 определяет константу нулевого указателя как «целочисленное константное выражение со значением 0 или такое выражение, приведенное к типу void *». Поскольку нет другого определения для константы нулевого указателя, соответствующее определение NULL должно быть расширено до целочисленного константного выражения со значением ноль (или приведено к void *).

Дальнейшее цитирование из C FAQ вопрос 5.5 (выделение добавлено):

Раздел 4.1.5 Стандарта C утверждает, что NULL «расширяется до определенной в реализации постоянной нулевого указателя, ”, Что означает, что реализация может выбирать, какую форму 0 использовать и использовать ли приведение` void * `; см. вопросы 5.6 и 5.7. «Определено реализацией» здесь не означает, что NULL может быть #defined, чтобы соответствовать некоторому зависящему от реализации ненулевому значению внутреннего нулевого указателя .

Это имеет смысл; поскольку стандарт требует нулевой целочисленной константы в контекстах указателя, чтобы скомпилировать в нулевой указатель (независимо от того, имеет ли внутреннее представление машины это значение, равное нулю), случай, когда NULL определен как ноль должен быть обработан в любом случае. Программист не обязан вводить NULL для получения нулевых указателей; это просто стилистическое соглашение (и может помочь отловить ошибки, например, когда NULL, определенный как (void *)0, используется в контексте без указателя).

Редактировать: один источник путаницы здесь, кажется, является кратким языком, используемым стандартом, то есть он явно не говорит, что нет другого значения , которое можно считать константой нулевого указателя. Однако когда в стандарте говорится «… называется константой нулевого указателя», это означает, что точно заданные определения называются константами нулевого указателя. Нет необходимости явно следовать каждому определению, указав, что является несоответствующим, когда (по определению) стандарт определяет, что соответствует .

12
ответ дан Philip Couling 28 November 2019 в 17:26
поделиться

Ну, я нашел способ доказать, что

#define NULL ((void*)-1)

не является юридическим определением NULL.

int main(void) 
{ 
   void (*fp)() = NULL;   
}

Инициализация указателя функции с помощью NULL является допустимой и правильной, тогда как ...

int main(void) 
{ 
   void (*fp)() = (void*)-1;   
}

... это нарушение ограничения, которое требует диагностики. Так что это вышло.

Но определение __builtin_magic_null_pointer в NULL не будет страдать от этой проблемы. Я все еще хотел бы знать, может ли кто-нибудь придумать причину, почему этого не может быть.

1
ответ дан janks 28 November 2019 в 17:26
поделиться

Целочисленное константное выражение со значением 0, или , такое как выражение, приведенное к типу void *, называется константой нулевого указателя .

NULL, который расширяется до определенной в реализации константы нулевого указателя ;

, следовательно, либо

NULL == 0

или

NULL == (void *) 0

0
ответ дан Erich Kitzmueller 28 November 2019 в 17:26
поделиться

Константа нулевого указателя должна оценивать 0, иначе выражения типа ! Ptr не будут работать как ожидал.

NULL макрос расширяется до 0-значного выражения; AFAIK, так было всегда.

-1
ответ дан 28 November 2019 в 17:26
поделиться
Другие вопросы по тегам:

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