Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> extern keyword, для импорта и экспорта 
:(
    Опции темы
ZAVS
Дата 21.12.2005, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 25.2.2004
Где: ЕРЕВАН

Репутация: нет
Всего: 1



Привет

Насколько я знаю extern используется для импорта переменной или функции.
Так вот сегодня увидел код где extern используется и при обьявлении экспортируемой функции.

У меня вот какой вопрос:

Если это не ошибка, то для чего функция обьявлена как extern???
--------------------
Учись студент доцентом станешь :)
PM MAIL ICQ   Вверх
Romikgy
Дата 21.12.2005, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



Для того , что ф-ция объявлена вне твоего модуля/проги


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
ZAVS
Дата 21.12.2005, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 25.2.2004
Где: ЕРЕВАН

Репутация: нет
Всего: 1



Цитата(Romikgy @ 21.12.2005, 16:39)
Для того , что ф-ция объявлена вне твоего модуля/проги


extern использован при объявлении функции

Код

extern int Init(OPTION *netopt)
{
  if (!initialized)
  {
#ifdef    WIN32
    WORD    wVersionRequested;
    WSADATA    wsaData;

    wVersionRequested = MAKEWORD(2, 2);

    if (WSAStartup(wVersionRequested, &wsaData) != 0)
 
    .................
}



Добавлено @ 16:46
а насколько я знаю extern используют во время импорта
когда то что импортируешь обявляется после или находиться вне файла.

Это сообщение отредактировал(а) ZAVS - 21.12.2005, 16:44
--------------------
Учись студент доцентом станешь :)
PM MAIL ICQ   Вверх
Romikgy
Дата 21.12.2005, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



Цитата
21. Как сделать глобальную переменную, доступной всем моим файлам .CPP?

Для начала, в одном из файлов .CPP (и только одном) объявите переменную, которая будет глобальной (то есть за пределами всех функций и классов). Например:

  int g_volume;
Затем, в заголовочном файле, который будет включён во все файлы .CPP - такой как stdafx.h - добавьте объявление extern:

  extern int g_volume;
Ключевое слово extern указывает компилятору, что g_volume объявлена в других файлах .CPP как int. Если Вы пропустите первый шаг, то компилятор выдаст unresolved external error.

© sources.ru

Добавлено @ 17:02
При написании библиотеки юзают такой код (для совместимости с С)
Код

// crtdll.h
#ifdef __cplusplus
extern "C" {
#endif

typedef unsigned size_t;

/* stdio.h */
int sprintf(char *buffer, const char *format, ...);

/* stdlib.h (alloc.h) */
void *malloc(size_t size);
void *realloc(void *block, size_t size);
void free(void *block);

/* mem.h */
void *memcpy(void *dest, const void *src, size_t n);
void *memset(void *s, int c, size_t n);
int memcmp(const void *s1, const void *s2, size_t n);

/* string.h */
int strncmp(const char *s1, const char *s2, size_t maxlen);
char *strchr(char *s, int c);
char *strrchr(char *s, int c);

/* not include standard string.h */
#define __STRING_H

#ifdef __cplusplus
};
#endif




--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
ZAVS
Дата 21.12.2005, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 25.2.2004
Где: ЕРЕВАН

Репутация: нет
Всего: 1



Цитата(Romikgy @ 21.12.2005, 16:58)
Для начала, в одном из файлов .CPP (и только одном) объявите переменную, которая будет глобальной (то есть за пределами всех функций и классов). Например:

  int g_volume;


а у меня и это обьявлено extern-ом

Цитата(Romikgy @ 21.12.2005, 16:58)
Затем, в заголовочном файле, который будет включён во все файлы .CPP - такой как stdafx.h - добавьте объявление extern:

  extern int g_volume;


ну это само собой

я спращиваю почему сама функция обьявляется extern-oм??
--------------------
Учись студент доцентом станешь :)
PM MAIL ICQ   Вверх
Romikgy
Дата 21.12.2005, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



http://program.rin.ru/razdel/html/173.html
Добавлено @ 17:10
Если брать по аналогии с созданием длл, то эта ф-ция будет в библиотеке (наверное типа либ) и вызыватся она будет из другого модуля


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
ZAVS
Дата 21.12.2005, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 25.2.2004
Где: ЕРЕВАН

Репутация: нет
Всего: 1



Цитата
Ключевое слово extern (внешнее) указывает, что описание a в file2.c является (только) описанием, а не определением. Если бы a инициализировалось, extern было бы просто проигнорировано, поскольку описание с инициализацией всегда является определением

это отсюда http://program.rin.ru/razdel/html/173.html

а у меня extern используется при определении функции!
и я спрашиваю правильно ли это, если да то почему он используется.???
--------------------
Учись студент доцентом станешь :)
PM MAIL ICQ   Вверх
Romikgy
Дата 21.12.2005, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



Это твоя программа/модуль? Если нет то подозреваю , что кто-то делал что-то типа длл-библиотеки


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
ZAVS
Дата 22.12.2005, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 25.2.2004
Где: ЕРЕВАН

Репутация: нет
Всего: 1



Это библиотека.

Если определяешь функцию для длл то она должна быть extern-ом??
--------------------
Учись студент доцентом станешь :)
PM MAIL ICQ   Вверх
Romikgy
Дата 22.12.2005, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



Да


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Neitron
Дата 22.12.2005, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 580
Регистрация: 3.10.2005
Где: Москва

Репутация: 2
Всего: 5



Это сделано для того чтобы ф-ция была определена только единожды.
Если включать файл в другие файлы ф-ция может определится дважды, это конечно не факт, но стандарт не гарантирует что такое произойти не может.
Если использовать #pragma once или
#ifndef H_FILE
#define H_FILE

extern можно опустить.

Ф-ция для библиотеки, не обязана быть extern.

Это сообщение отредактировал(а) Neitron - 22.12.2005, 10:32


--------------------
Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей.
Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ
PM MAIL   Вверх
Romikgy
Дата 22.12.2005, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



extern обычно используется при раздельной компиляции исходных файлов. (с) "С++ Специальный справочник"


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
ZAVS
Дата 22.12.2005, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 25.2.2004
Где: ЕРЕВАН

Репутация: нет
Всего: 1



а extern-ом функция описана не только в header файле а и в cpp файле
вот по этому и у меня возник вопрос.
--------------------
Учись студент доцентом станешь :)
PM MAIL ICQ   Вверх
Neitron
Дата 22.12.2005, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 580
Регистрация: 3.10.2005
Где: Москва

Репутация: 2
Всего: 5



ZAVS
В Сpp афтар перестарался, или просто расчитывал, что кто-то будет включать и сpp файлы.
Это делать не обязательно.

Это сообщение отредактировал(а) Neitron - 22.12.2005, 10:38


--------------------
Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей.
Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ
PM MAIL   Вверх
Romikgy
Дата 22.12.2005, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



Цитата(Neitron @ 22.12.2005, 10:36)
Это делать не обязательно.
точно smile



--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0606 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.