Как мне написать аддон Firefox? [закрыто]

(Извините, я только что заметил, что этот вопрос отмечен как c, а не c++. Возможно, мой ответ не так важен для этого вопроса!) [/ ​​g3]

Строковые литералы не совсем const или not-const, существует специальное странное правило для литералов.

(Резюме: литералы могут быть взяты с помощью ссылки на массив как foo( const char (&)[N]) и не могут быть приняты как не-const. Они предпочитают распадаться до const char *. Пока что это похоже на то, что они const. Но существует специальное правило, разрешает литералы распадаться на char *. См. эксперименты ниже.)

(После экспериментов, выполненных на clang3.3 с -std=gnu++0x. Возможно, это проблема C ++ 11 или конкретная для clang? Кстати, что-то странное происходит.)

Сначала литералы выглядят как const:

void foo( const char  * ) { std::cout << "const char *" << std::endl; }
void foo(       char  * ) { std::cout << "      char *" << std::endl; }

int main() {
        const char arr_cc[3] = "hi";
        char arr_c[3] = "hi";

        foo(arr_cc); // const char *
        foo(arr_c);  //       char *
        foo("hi");   // const char *
}

Эти два массива ведут себя так, как ожидалось, демонстрируя, что foo может указать нам, является ли указатель const или нет. Затем "hi" выбирает const версию foo. Кажется, что это решает: литералы const ... не так ли?

Но , если вы удалите void foo( const char * ), тогда это становится странным. Во-первых, вызов foo(arr_c) не выполняется с ошибкой во время компиляции. Это ожидается. Но буквальный вызов (foo("hi")) работает через неконстантный вызов.

Итак, литералы «больше const», чем arr_c (потому что они предпочитают распадаться на const char *, в отличие от arr_c. Но литералы «меньше const», чем arr_cc, потому что они желают распадаться на char *, если это необходимо.

(Кланг дает предупреждение, когда он распадается на char *).

Но как насчет разложения? Давайте избежим этого для простоты.

Давайте возьмем массивы по ссылке в foo вместо этого. Это дает нам более «интуитивные» результаты:

void foo( const char  (&)[3] ) { std::cout << "const char (&)[3]" << std::endl; }
void foo(       char  (&)[3] ) { std::cout << "      char (&)[3]" << std::endl; }

Как и раньше, литерал и массив const (arr_cc) используют версию const, а версия non-const используется arr_c. И если мы удалим foo( const char (&)[3] ), тогда мы получим ошибки с обоими foo(arr_cc); и foo("hi");. Короче говоря, если мы избежим распада указателя и будем использовать ссылку на массив, литералы будут вести себя так, как если бы они были const.

Шаблоны?

В шаблонах система выведет const char * вместо char *, и вы «застряли» с этим.

template<typename T>
void bar(T *t) { // will deduce   const char   when a literal is supplied
    foo(t);
}

Итак, буквально ведет себя как const на ll раз, за ​​исключением конкретного случая, когда вы непосредственно инициализируете char * литералом.

140
задан Will 19 March 2013 в 19:25
поделиться

4 ответа

Мы пытались сделать , http://developer.mozilla.org/en/Extensions отвечает на все те вопросы. Первые три ссылки в разделе документации о начале работы (который включает ссылку Adam). Группа новостей и irc канал в разделе Community являются официальными форумами.

Mozilla очень сложен, таким образом, любой вид руководства API был бы подавляющим и твердым записать. Таким образом, Ваш лучший выбор состоит в том, чтобы проверить страницу фрагментов кода (также связанный от страницы MDC Extensions), затем поисковый MDC/google, затем спросить на форумах.

94
ответ дан Nickolay 19 March 2013 в 19:25
поделиться

Вот официальная страница начинающего от Mozilla для записи Вашего первого расширения. http://developer.mozilla.org/en/Building_an_Extension

20
ответ дан Adam Haile 19 March 2013 в 19:25
поделиться

Это - большой ресурс, чтобы начать изучать, как создать расширение FireFox:
, Как создать расширения Firefox

, Это - потрясающее учебное руководство, и будут покрытия большая часть типа расширений.

Редактирование: Обновленная ссылка для использования заархивированной копии начиная с исходной страницы больше не существует

5
ответ дан Ryan Farley 19 March 2013 в 19:25
поделиться
  • 1
    Путь дан в документах, с которыми я связался. – Alasdair 10 June 2013 в 20:35

Я нашел, что механик был большой начальной точкой... Я использовал его для создания некоторой функциональности для сайта, тогда я использовал этот компилятор сценария для превращения моего сценария в рабочее дополнение. Конечно, это - машина, сгенерированная..., но это - очень немного файлов и довольно легкий понять. Просто разархивируйте .xpi и ремесленника далеко.

10
ответ дан danb 19 March 2013 в 19:25
поделиться
  • 1
    Мои шаблонные процессоры контекста (" django.contrib.auth.context_processors.auth" " django.core.context_processors.debug" " django.core.context_processors.i18n" " django.core.context_processors.media" " django.core.context_processors.static" " django.core.context_processors.tz" " django.contrib.messages.context_processors.messages") what' s путь к запросу один? – Xonal 10 June 2013 в 20:33
Другие вопросы по тегам:

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