статичный по сравнению с экстерном “C” / “C++”

Похоже, теги - это просто list из str, так что это должно сработать:

for index, row in df.iterrows():
    params = {
        'id': row['id'],
        'tags': ','.join(row['tags']), 
    }
    print(params)

    r = requests.post(url, data=params, headers=headers)
    print(r)
22
задан Giovanni Funchal 14 March 2017 в 06:32
поделиться

4 ответа

Да, Вы просто удачливы:) Экстерн "C" является одной связью языка для языка C, который каждый компилятор C++ должен поддерживать около экстерна "C++", который является значением по умолчанию. Компиляторы могут поддерживать другие связи языка. GCC, например, поддерживает экстерна "Java", который позволяет взаимодействовать через интерфейс с кодом Java (хотя это является довольно громоздким).

экстерн "C" говорит компилятору, что Ваша функция является вызываемой кодом C. Это, но не должен, может включать соответствующее соглашение о вызовах и соответствующее искажение имени языка C (иногда названный "художественным оформлением") среди прочего в зависимости от реализации. Если у Вас есть статическая функция членства, соглашение о вызовах для нее является тем Вашего компилятора C++. Часто они совпадают с для компилятора C той платформы - таким образом, я сказал, что Вы просто удачливы. Если у Вас есть API C, и Вы передаете указатель функции, лучше всегда помещаете тот в функцию, объявленную с экстерном "C" как

extern "C" void foo() { ... }

Даже при том, что тип указателя функции не содержит спецификацию связи, а скорее похож

void(*)(void)

, связь является неотъемлемой частью типа - Вы просто не можете выразить этого непосредственно без определения типа:

extern "C" typedef void(*extern_c_funptr_t)();

компилятор C++ Comeau, в строгом режиме, испустит ошибку, например, при попытке присвоить адрес экстерна "C" функция вышеупомянутых к (void(*)()), beause это указатель на функцию со связью C++.

33
ответ дан 29 November 2019 в 04:26
поделиться

Отметьте, это extern C , рекомендовал способ совместимости C/C++. Здесь ведущее устройство, говорящее об этом. Добавить к ответу eduffy: обратите внимание, что статические функции и переменные в глобальном пространстве имен удерживаются от использования. Используйте анонимное пространство имен, по крайней мере.

Назад к extern C: если Вы не используете экстерна C, необходимо будет знать точное скорректированное имя и использовать его. Это - намного больше боли.

5
ответ дан 29 November 2019 в 04:26
поделиться

extern "C" отключает искажение названия компилятора C++ (который требуется для перегрузки).

, Если Вы объявляете, что функция в A.cpp static, тогда это не может быть найдено B.cpp (это является оставшимся от C, и это имеет тот же эффект помещения функции в анонимном пространстве имен).

4
ответ дан 29 November 2019 в 04:26
поделиться

Большая часть того, что extern "C" делает, является в основном иждивенцем компилятора. Много платформ изменяют искажение имени и соглашение о вызовах, базирующееся от объявления, но ничего подобного не определяется стандартом. Действительно единственная вещь, которой требует стандарт, состоит в том, что код в блоке является вызываемым от функций C. Что касается Вашего конкретного вопроса, говорится в стандарте:

Два функциональных типа с различными связями языка являются отличными типами, даже если они в других отношениях идентичны.

Это означает extern "C" void proxy(int i) {}, и /*extern "C++"*/void proxy(int i) {} имеют различные типы, и в результате указатели на эти функции имели бы различные типы также. Компилятор не приводит Ваш код к сбою по той же причине, как которая он не привел бы большую обрабатываемую деталь к сбою:

int *foo = (int*)50;
makecontext(..., (void (*)(void)) foo, ...);

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

Что касается статических функций членства, они не обязаны иметь this указатель, таким образом, компилятор является бесплатным рассматривать их как не функцию членства. Снова, поведение здесь является конкретной платформой.

2
ответ дан 29 November 2019 в 04:26
поделиться
Другие вопросы по тегам:

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