Перейти к содержанию
    

Не могу объявить нулевой указатель на функцию

nullptr в С++ это отдельная штука (ключевое слово) на уровне компилятора, и его разыменование невозможно. А тех языках, где NULLPTR определён просто как дефайн, равный 0, там при разименовании получится обращение к адресу 0..

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 минут назад, vvppvv сказал:

Поэтому мне явно указаный "0" с приведением типа как-то спокойнее, чем "нулл" из какой-то библиотеки. :))

Вам дело говорят - nullptr это правильным образом описанный нулевой указатель. Разыменование и nullptr, и 0, это undefined behavior.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 minutes ago, EdgeAligned said:

nullptr в С++ это отдельная штука (ключевое слово) на уровне компилятора, и его разыменование невозможно. А тех языках, где NULLPTR определён просто как дефайн, равный 0, там при разименовании получится обращение к адресу 0..

Так получилось, что к Си я пришёл через ассемблер. Если процессор допускает косвенный вызов функции с адреса 0х0000 (т.н. "мягкий" или "софтверный" ресет), а стандарт языка такое не допускает, то зачем мне такой язык нужен? Я больше железячник, а не программист. Мне ехать, а не шашечки. ))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

24 minutes ago, vvppvv said:

Поэтому мне явно указаный "0" с приведением типа как-то спокойнее

ну в таком случае осторожнее пользуйтесь компилятором, а лучше сразу в машинных кода, а то вдруг компилятор нарушит свои же обязательства ))))

 

11 minutes ago, vvppvv said:

чем "нулл" из какой-то библиотеки

NULL - это по сути просто макрос, описанный внутри stdlib, это и есть 0, во всех компиляторах:

#define NULL ((void *) 0)

 

 

а nullptr - это вообще ключевое слово из плюсов, обязательное начиная с C++11:

https://ru.wikipedia.org/wiki/Nullptr

stddef.h:

#ifdef __cplusplus
    typedef decltype(nullptr) nullptr_t;
#endif

 

 

nullptr компилятор сам автоматом приводит к нужному типу, исключая необходимость приведения типов, как это иногда требовалось для NULL, что сильно разгружает код

и поскольку nullptr - ключевое слово компилятора, то оно подкрашивается в среде и сразу бросается в глаза, 

 

к слову, во всех своих старых проектах при случае убираю NULL где вижу и заменяю на уже "каноничное" nullptr ))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

15 minutes ago, Arlleex said:

Вам дело говорят - nullptr это правильным образом описанный нулевой указатель.

"Error[Pe020]: identifier "nullptr" is undefined D:\_Workdir\ (.......)\main.c 499 "

И в то же время

    499                rc_Count_Ptr = 0;
   \                     ??main_11:
   \   000001C8   24EE               CLR     R14
   \   000001CA   24FF               CLR     R15

Я так думаю, что nullptr - это для С++.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 minutes ago, vvppvv said:

Так получилось, что к Си я пришёл через ассемблер.

ну, так получилось, что тут практически все прошли такой же путь, просто кто-то уже ушел чуть дальше 😉

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 minutes ago, Forger said:

и поскольку nullptr - ключевое слово компилятора, то оно подкрашивается в среде и сразу бросается в глаза, 

Да, компилятор его подкорашивает! Но т.к. я пишу в Си, ругается:  "Error[Pe020]: identifier "nullptr" is undefined"

Изменено пользователем vvppvv

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

37 minutes ago, vvppvv said:

Я так думаю, что nullptr - это для С++.

так и есть, выше постом ссылка на соотв страницу в википедии ))

 

36 minutes ago, vvppvv said:

Но т.к. я пишу в Си, ругается:

ну и кто в этом виноват? ))

переходите на плюсы 😎  начнется правда ругань другого рода ))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

23 minutes ago, Forger said:

переходите на плюсы 😎  начнется правда ругать другого рода ))

Я когда-то давно пробовал перейти на С++. Ну как же, это модно, нужно быть в тренде. и пр. Потом понял, что эти костыли были придуманы для человека, мыслящего как человек и неспособного мыслить как процессор. А как известно, чтобы японскому мастеру нарисовать корову - надо стать коровой. :))))  Потому я не стал себя больше насиловать, натягивая противоестественное, и скатился обратно к натуралам, в нативный для AVR Си-ассемблер. 

Изменено пользователем vvppvv

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 minutes ago, vvppvv said:

Ну как же, это модно, нужно быть в тренде. и пр.

Не надо слушать всяких "маркетологов", плюсы - это такой же инструмент, как и просто С.

Ну, не получилось освоить сходу плюсы, так значит или не пришло время или нет таких задач, кто он реально требуется. 

Если всю жисть привыкли работать "молотком и топором" и результат вас полностью устраивает, то более тонкие инструменты вам совсем не нужны )

К таким "инструментам тонкой работы" приходят по необходимости, когда уже "молотком и топором" тупо не получается хорошо сделать то, что требуется.

 

11 minutes ago, vvppvv said:

Потому я не стал себя больше насиловать

и правильно, дело это противоестественное ))

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

36 минут назад, vvppvv сказал:

Так получилось, что к Си я пришёл через ассемблер. Если процессор допускает косвенный вызов функции с адреса 0х0000 (т.н. "мягкий" или "софтверный" ресет)

Многие из нас, кто старше 35-40, пришли через ассемблер. И когда я переходил на Си, мне тоже казалось - блин, че за дела, я привык всё контролировать сам и я мыслю как процессор! Но ни че, со временем втянулся и понял - а накой мне контролировать каждый такт, каждую инструкцию. И тогда у меня появилось больше времени на разработку прикладных алгоритмов и мои поделки стали более навороченными.

Кстати, не все МК имеют старт программы с 0ч0000. Например, в АРМ нулевой адрес - это место таблицы векторов, которая уже и определяет, с какого адреса начнется программа. (Если быть точным, то адрес 0x0000'0004 содержит адрес, по которому МК перейдет и выполнит первую рабочую инструкцию).

Поэтому, NULL равный 0 - это просто условность для проверки на число, которое не может быть адресом исполняемой инструкции или данных. Этот 0 служит только для проверки. Кстати, в C++ nullptr тоже численно равен 0. Но для компилятора nullptr имеет еще и дополнительный смысл.

Или вот еще нуль-терминированная строка ANSI-символов, которая содержит 0 в конце, как признак завершения ANSI-данных в строке.

PS. Между прочим, вот в Адруине хоть и AVR, но на "богомерзком" для AVR языке С++ 🙂 🙂

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, vvppvv сказал:

Да, компилятор его подкорашивает! Но т.к. я пишу в Си, ругается:  "Error[Pe020]: identifier "nullptr" is undefined"

NULL для Си.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кстати, можно создать С/С++ проект с плюсомым компилятор ом, но писать в стиле Си, не используя инструментов ++

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 minutes ago, EdgeAligned said:

Кстати, можно создать С/С++ проект с плюсомым компилятор ом, но писать в стиле Си, не используя инструментов ++

и это все ради доступа к nullptr? ))

достаточно просто переименовать файлы *.c в *.cpp, умная среда и компилятор автоматом поймут что от них хотят

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 minutes ago, EdgeAligned said:

Кстати, можно создать С/С++ проект с плюсомым компилятор ом, но писать в стиле Си, не используя инструментов ++

Я использую "//" в комментариях, а это, строго говоря, уже из плюсов. Но компилятор позволяет. :)) Вообще, конечно, всё зависит от задач, тут я полностью согласен. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...