Я хочу переопределить ПУСТОЙ УКАЗАТЕЛЬ в своей программе такой как
#define MYNULL ((void*)0)
Но это определение не работает в следующем утверждении:
char *ch = MYNULL;
Ошибка: не может преобразовать из пустоты* для обугливания *
Каков был бы лучший способ определить ПУСТОЙ УКАЗАТЕЛЬ?
Я только что видел ваш код.
Убедитесь, что используемый языковой стандарт
получен от 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
будут работать в обоих.
#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" будет ключевым словом .
В чем именно проблема с получением вашего NULL откуда вы должны?, То есть
#include <stddef.h>
или
#include <cstddef>
, как указано в @ Ответ Йоханнеса Рудольфа, любая уловка, которую вы делаете, вряд ли будет очень надежным в будущем перед лицом таких вещей, как nullptr
и т. Д.
РЕДАКТИРОВАТЬ: в то время как stdlib (и многие другие) должны включать NULL
, stddef - самый канонический заголовок [и так было уже несколько десятилетий].
PS В общем, ввязываться в такого рода уловки - плохая идея, если у вас нет действительно веской причины. Вы не расширили те мысли, которые привели вас к ощущению необходимости делать это. Если бы вы могли добавить некоторые подробности по этому поводу, это, вероятно, приведет к лучшим ответам. Другие люди, отвечающие на этот вопрос, тоже должны были указать на это в своих ответах, но я полагаю, что FGITW делает лучше, чем FGITW: D
РЕДАКТИРОВАТЬ 2: Как указано @Yossarian: Единственное оправдание для этого - отсутствие NULL определен в соответствующей языковой форме в другом месте вашей системы. Голые компиляторы без заголовков и / или если вы пишете свою собственную стандартную библиотеку с нуля, являются примерами таких обстоятельств. (В таком простом сценарии я бы пошел с ответом @ lilburne (обязательно используйте 0
как можно больше))
Алгоритм Левенштейна: 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++
Я думаю, что любой, кто не знает, что установка указателя в C/C++ в 0 - это то же самое, что установка его в NULL, nullptr или любой другой эквивалент, не должен возиться с кодом. Разница в читабельности между
char* ch = NULL
и
char* ch = 0;
минимальна. Когда речь идет о выражениях, формы
if (NULL == ch) {
}
if (0 == ch) {
}
if (nullptr == ch) {
}
не более читабельны, чем
if (!ch) {
}
Не делай этого. Ничто не говорит о том, что NULL должен быть нулевым значением, это зависит от реализации.
Это может быть значение, представляющее конец памяти, какое-то особое место в памяти или даже объект, который не представляет никакого значения.
Это очень опасно, может нарушить переносимость и, безусловно, приведет к проблемам с редакторами, поддерживающими код. Это ничего вам не покупает, доверьтесь определению своей библиотеки.
РЕДАКТИРОВАТЬ: Эван прав! В коде будет указано «ноль», внутри компилятор может делать все, что он хочет, с конкретными деталями реализации. Спасибо, Эван!
В отличие от того, что утверждают здесь некоторые люди, 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 НЕ являются переносимой инициализацией для указателей.