Какой самый четкий способ объявления константного указателя?

Я использую пару функций, которые используют указатель как уникальный ключ. Я хочу объявить постоянный указатель для использования в качестве ключа. Какой самый безопасный и ясный способ сделать это?

Вот два возможных подхода, но оба из них имеют короткие приходы.

  • Указатель саморегуляции:

    static const void * const propertyKey = &propertyKey;
    //...
    objc_getAssociatedObject(object, propertyKey);
    

    Даунсайд: декларация длинная и страшно выглядит! Может легко смутить кого-то, кто не знает, для чего это. Потенциал: жесткий, когда вы понимаете, что он делает это легко использовать.

  • Статическая константа, на которую нужно ссылаться:

    static const char propertyKey;
    //...
    objc_getAssociatedObject(object, &propertyKey);
    

    Нижняя сторона: при использовании переменная должна ссылаться, а не просто использоваться, что легко пропустить (но компилятор должен указать это как несоответствие типа). Если объявление изменено так, что ему присвоено значение, оно может иметь катастрофические последствия, поскольку уникальность указателя больше не может быть гарантирована. Потенциал: декларация легче проверять.

Я не думаю, что одно из них сразу же очевидно. Любые лучшие предложения?

Ответ 1

Мне также нравится ваша первая идея. Я бы просто пошел с этим. Ваша вторая идея рискует, что компилятор может свернуть несколько переменных static const char в один, поскольку они гарантированно будут всегда хранить значение 0, и, с точки зрения компилятора, я не уверен, что они достаточно различны. И я не могу придумать лучшего решения, кроме вашей первой идеи.

(Поднято для ответа из обсуждения в комментариях.)

Ответ 2

3: указатель, который задает что-то значимое, но уникальное:

static const void *const key = "PropertyKey";