Как определить ПУСТОЙ УКАЗАТЕЛЬ с помощью #define

Я хочу переопределить ПУСТОЙ УКАЗАТЕЛЬ в своей программе такой как

#define MYNULL ((void*)0)

Но это определение не работает в следующем утверждении:

char *ch = MYNULL;

Ошибка: не может преобразовать из пустоты* для обугливания *

Каков был бы лучший способ определить ПУСТОЙ УКАЗАТЕЛЬ?

8
задан legends2k 24 February 2010 в 17:26
поделиться

7 ответов

Я только что видел ваш код.

Убедитесь, что используемый языковой стандарт получен от java.util, а не от android. Ваш код не изменит языковой стандарт мобильного телефона.

Чтобы проверить его:

  • Я установил свой телефон на испанский.
  • Откройте приложение
  • нажмите кнопку
  • , чтобы перейти домой
  • Значки были на испанском языке, а не на английском.

Если вы пытаетесь просто настройка языковой стандарт до значения по умолчанию и быть можете увидеть то же самое значение после поворота экрана:

Вместо:

android:configChanges="locale"

используйте:

android:configChanges="locale|orientation"
-121--1684982-

Можно задать параметры действия, как определено ниже.

<activity android:allowTaskReparenting=["true" | "false"]
          android:alwaysRetainTaskState=["true" | "false"]
          android:clearTaskOnLaunch=["true" | "false"]
          android:configChanges=["mcc", "mnc", "locale",
                                 "touchscreen", "keyboard", "keyboardHidden",
                                 "navigation", "orientation", "fontScale"]
          android:enabled=["true" | "false"]
          android:excludeFromRecents=["true" | "false"]
          android:exported=["true" | "false"]
          android:finishOnTaskLaunch=["true" | "false"]
          android:icon="drawable resource"
          android:label="string resource"
          android:launchMode=["multiple" | "singleTop" |
                              "singleTask" | "singleInstance"]
          android:multiprocess=["true" | "false"]
          android:name="string"
          android:noHistory=["true" | "false"]  
          android:permission="string"
          android:process="string"
          android:screenOrientation=["unspecified" | "user" | "behind" |
                                     "landscape" | "portrait" |
                                     "sensor" | "nosensor"]
          android:stateNotNeeded=["true" | "false"]
          android:taskAffinity="string"
          android:theme="resource or theme"
          android:windowSoftInputMode=["stateUnspecified",
                                       "stateUnchanged", "stateHidden",
                                       "stateAlwaysHidden", "stateVisible",
                                       "stateAlwaysVisible", "adjustUnspecified",
                                       "adjustResize", "adjustPan"] >   
    . . .
</activity>
-121--3802315-
#ifdef __cplusplus
#define MYNULL 0
#else
#define MYNULL ((void*)0)
#endif

будут работать в обоих.

17
ответ дан 3 November 2019 в 12:09
поделиться
#define MYNULL NULL

- самый безопасный, я не вижу смысла в этом, но если вы действительно хотите, продолжайте. Вот как это делают C и C ++ это соответственно:

#define NULL 0 //C++
#define NULL ((void*)0) //C

Вообще говоря, определение 0 для NULL - плохая привычка, вы действительно хотите, чтобы это было частью языка. C ++ 0x обращается к этому.

Вот что Бьярн Страуструп говорит по поводу этого :

Должен ли я использовать NULL или 0?

В C ++ определение NULL равно 0, так что там это только эстетическая разница. Я предпочитаю избегать макросов, поэтому использую 0. Другая проблема с NULL заключается в том, что люди иногда ошибочно полагают, что он отличается от 0 и / или не целое число. В предстандартном коде NULL иногда определялся как что-то неподходящее, и поэтому должен был / должен быть исключен. В наши дни это не так . Если вам нужно назвать нулевой указатель, назовите его nullptr; именно так он будет вызываться в C ++ 0x. Тогда "nullptr" будет ключевым словом .

28
ответ дан 3 November 2019 в 12:09
поделиться

В чем именно проблема с получением вашего NULL откуда вы должны?, То есть

#include <stddef.h>

или

 #include <cstddef>

, как указано в @ Ответ Йоханнеса Рудольфа, любая уловка, которую вы делаете, вряд ли будет очень надежным в будущем перед лицом таких вещей, как nullptr и т. Д.

РЕДАКТИРОВАТЬ: в то время как stdlib (и многие другие) должны включать NULL , stddef - самый канонический заголовок [и так было уже несколько десятилетий].

PS В общем, ввязываться в такого рода уловки - плохая идея, если у вас нет действительно веской причины. Вы не расширили те мысли, которые привели вас к ощущению необходимости делать это. Если бы вы могли добавить некоторые подробности по этому поводу, это, вероятно, приведет к лучшим ответам. Другие люди, отвечающие на этот вопрос, тоже должны были указать на это в своих ответах, но я полагаю, что FGITW делает лучше, чем FGITW: D

РЕДАКТИРОВАТЬ 2: Как указано @Yossarian: Единственное оправдание для этого - отсутствие NULL определен в соответствующей языковой форме в другом месте вашей системы. Голые компиляторы без заголовков и / или если вы пишете свою собственную стандартную библиотеку с нуля, являются примерами таких обстоятельств. (В таком простом сценарии я бы пошел с ответом @ lilburne (обязательно используйте 0 как можно больше))

9
ответ дан 3 November 2019 в 12:09
поделиться

Алгоритм Левенштейна: http://en.wikipedia.org/wiki/Levenshtein_distance

Все, что не является результатом нуля, означает, что текст не является «идентичным». «Подобные» - это мера того, как далеко/близко они находятся. Результатом является целое число.

-121--2470063-

Вы не можете сделать это в Ruby.

Ключевое слово return всегда возвращает метод или лямбду в текущем контексте. В блоках он возвращается из метода, в котором замыкание было определено . Невозможно выполнить возврат из вызывающего метода или лямбды.

Rubyspec демонстрирует, что это действительно правильное поведение для Ruby (очевидно, не реальная реализация, но нацелена на полную совместимость с C Ruby):

describe "The return keyword" do
# ...
describe "within a block" do
# ...
it "causes the method that lexically encloses the block to return" do
# ...
it "returns from the lexically enclosing method even in case of chained calls" do
# ...
-121--814743-
#define MYNULL 0

будет работать в C++

2
ответ дан 3 November 2019 в 12:09
поделиться

Я думаю, что любой, кто не знает, что установка указателя в C/C++ в 0 - это то же самое, что установка его в NULL, nullptr или любой другой эквивалент, не должен возиться с кодом. Разница в читабельности между

char* ch = NULL

и

char* ch = 0;

минимальна. Когда речь идет о выражениях, формы

if (NULL == ch) {
}
if (0 == ch) {
}
if (nullptr == ch) {
}

не более читабельны, чем

if (!ch) {
}
1
ответ дан 3 November 2019 в 12:09
поделиться

Не делай этого. Ничто не говорит о том, что NULL должен быть нулевым значением, это зависит от реализации.

Это может быть значение, представляющее конец памяти, какое-то особое место в памяти или даже объект, который не представляет никакого значения.

Это очень опасно, может нарушить переносимость и, безусловно, приведет к проблемам с редакторами, поддерживающими код. Это ничего вам не покупает, доверьтесь определению своей библиотеки.

РЕДАКТИРОВАТЬ: Эван прав! В коде будет указано «ноль», внутри компилятор может делать все, что он хочет, с конкретными деталями реализации. Спасибо, Эван!

1
ответ дан 3 November 2019 в 12:09
поделиться

В отличие от того, что утверждают здесь некоторые люди, 0 является вполне допустимым определением для NULL в C. Таким образом, вы должны быть осторожны, когда даете NULL в качестве аргумента переменной функции, потому что он может быть ошибочно принят за целочисленное значение 0, что приведет к непереносимости.

http://c-faq.com/null/null2.html

BTW, comp.lang.c FAQ - это настоятельно рекомендуемое чтение для каждого программиста на C. Например, здесь:

http://c-faq.com/null/null1.html

содержатся такие жемчужины почти забытой мудрости, как "Как упоминалось выше, для каждого типа указателя существует нулевой указатель, и внутренние значения нулевых указателей для разных типов могут быть разными." Что означает, что calloc или memset НЕ являются переносимой инициализацией для указателей.

0
ответ дан 3 November 2019 в 12:09
поделиться