Что означает extern c
Понимание ключевого слова extern в C
Я уверен, что этот пост будет столь же интересным и информативным для девственниц C (то есть для начинающих), так и для тех, кто хорошо разбирается в C. Итак, позвольте мне начать с того, что ключевое слово extern применяется к переменным C (объектам данных). и C. функции. В основном ключевое слово extern расширяет видимость переменных C и функций C. Вероятно, это причина, почему он был назван как extern.
Хотя (почти) каждый знает значение объявления и определения переменной / функции для полноты этого поста, я хотел бы прояснить их. Объявление переменной / функции просто объявляет, что переменная / функция существует где-то в программе, но память для них не выделена. Но объявление переменной / функции играет важную роль. И это тип переменной / функции. Поэтому, когда переменная объявлена, программа знает тип данных этой переменной. В случае объявления функции программа знает, каковы аргументы этой функции, их типы данных, порядок аргументов и тип возвращаемого значения функции. Так что это все о декларации. Что касается определения, когда мы определяем переменную / функцию, помимо роли объявления, она также выделяет память для этой переменной / функции. Поэтому мы можем думать об определении как о надмножестве объявления. (или объявление в качестве подмножества определения). Из этого объяснения должно быть очевидно, что переменная / функция может быть объявлена любое количество раз, но она может быть определена только один раз. (Помните основной принцип, что у вас не может быть двух местоположений одной и той же переменной / функции). Так что это все о декларации и определении.
Теперь вернемся к нашей главной цели: Понимание ключевого слова «extern» на языке C. Я объяснил роль объявления / определения, потому что необходимо понимать их, чтобы понимать ключевое слово «extern». Давайте сначала рассмотрим простой случай. Использование extern с функциями C. По умолчанию к объявлению и определению функции C добавлен «extern». Это означает, что хотя мы не используем extern с объявлением / определением функций C, он присутствует там. Например, когда мы пишем.
В начале есть внешний элемент, который скрыт, и компилятор обрабатывает его, как показано ниже.
То же самое имеет место с определением функции C (определение функции C означает написание тела функции). Поэтому всякий раз, когда мы определяем функцию C, в начале определения функции там присутствует extern. Поскольку объявление может быть сделано любое количество раз, а определение может быть выполнено только один раз, мы можем заметить, что объявление функции может быть добавлено в несколько файлов C / H или в один файл C / H несколько раз. Но мы замечаем фактическое определение функции только один раз (т.е. только в одном файле). И так как extern расширяет видимость всей программы, функции можно использовать (вызывать) в любом месте любого файла всей программы, если известно объявление функции. (Зная объявление функции, компилятор C знает, что определение функции существует, и он собирается скомпилировать программу). Так что это все о extern с функциями C.
Теперь давайте возьмем второй и последний случай, т.е. использование extern с C-переменными. Я чувствую, что это более интересно и информативно, чем предыдущий случай, когда extern присутствует по умолчанию с функциями C. Итак, позвольте мне задать вопрос, как бы вы объявили переменную C без ее определения? Многие из вас сочли бы это тривиальным, но это важный вопрос для понимания extern с C-переменными. Ответ состоит в следующем.
Здесь была объявлена переменная целочисленного типа var (не помню определения, т.е. пока нет выделения памяти для var). И мы можем сделать это заявление столько раз, сколько необходимо. (помните, что объявление может быть сделано любое количество раз) Пока все хорошо. 🙂
Теперь, как бы вы определили переменную? Теперь я согласен, что это самый тривиальный вопрос в программировании, и ответ таков.
Здесь переменная целочисленного типа с именем var была объявлена так же, как и определена. (помните, что определение является надмножеством объявления). Здесь также выделяется память для var. Теперь наступает сюрприз, когда мы объявили / определили функцию C, мы увидели, что extern присутствует по умолчанию. При определении функции мы можем без проблем добавить ее к extern. Но это не так с C переменными. Если мы поместим наличие extern в переменную по умолчанию, тогда память для них никогда не будет выделяться, они будут объявлены только. Поэтому мы явно указываем extern для переменных C, когда хотим объявить их, не определяя их. Кроме того, поскольку extern расширяет видимость всей программы, используя ключевое слово extern с переменной, мы можем использовать переменные в любом месте программы, если мы знаем их объявление и где-то определена переменная.
Теперь давайте попробуем понять extern с помощью примеров.
Что означает extern «C» или extern «C++»?
Что означает «Программа «[4872] laba!.exe: Машинный код» завершилась с кодом 3 (0x3).»?
при запуске кода компилятор пишет «Программа » laba. exe: Машинный код» завершилась с кодом 3.
Разница только в том, с каким именем создастся метка в коде
Evg,
Почти ничего не понял
Какая разница как функция называется в ассемблере? Как это мешает выполняться коду который соответствует этой функции?
Всмысле написать программу исходники которой писаны на си и с++? Компилятор же при компиляции одновременно не использует два стандарта. Он либо компилит код по определённому стандарту си, либо с++(или не так?).
Croessmah,
То есть речь уже о скомпилированной библиотеки которая подключается в коде? (Прагмой вроде).
Т.е насколько я понял если мне хочется использовать функцию из сишной либы, я пишу extern «C» имя функции, далее плюсовый компилятор преобразует это имя функции в то как если бы мы компилировали сишный а не плюсовый код. Таким образом получится вызвать функцию из заранее скомпилированной сишный либы. И это весь смысл extern «C»?
nd2,
Вы меня ещё больше запутали если extern «C» не преобразует название функции в си-стиль, тогда что оно делает и зачем нужно?
Перегруженные функции и без extern ведь можно использовать.
extern (C++)
extern Ключевое слово может быть применено к глобальной переменной, функции или объявлению шаблона. Он указывает, что символ имеет связь Al. Дополнительные сведения о компоновке и о том, почему не рекомендуется использовать глобальные переменные, см. в разделе Преобразование единиц и компоновки.
extern Ключевое слово имеет четыре значения в зависимости от контекста:
В const объявлении неглобальной переменной extern указывает, что переменная или функция определена в другой записи преобразования. extern Должен применяться ко всем файлам, за исключением того, где определена переменная.
В const объявлении переменной указывается, что переменная имеет extern связь Al. extern Должен применяться ко всем объявлениям во всех файлах. ( const По умолчанию глобальные переменные имеют внутреннюю компоновку.)
extern «C» Указывает, что функция определена в любом расположении и использует соглашение о вызовах на языке C. extern «C» Модификатор может также применяться к нескольким объявлениям функций в блоке.
extern компоновка для const неглобальных элементов
Если компоновщик видит extern перед объявлением глобальной переменной, он ищет определение в другой записи преобразования. Объявления const непеременных в глобальной области extern по умолчанию имеют значение Al. Применяется только extern к объявлениям, не предоставляющим определение.
extern компоновка для const глобальных элементов
const По умолчанию глобальная переменная имеет внутреннюю компоновку. Если требуется, чтобы переменная соимела extern связь Al, примените extern к определению ключевое слово и ко всем остальным объявлениям в других файлах:
extern constexpr компоновка
extern «C» и extern «C++»
В C++ при использовании со строкой extern указывает, что для деклараторов используются соглашения компоновки другого языка. Доступ к функциям и данным C можно получить только в том случае, если они были ранее объявлены с компоновкой C. Однако они должны быть определены в блоке трансляции, который компилируется отдельно.
Пример
В следующем примере показано, как объявить имена с компоновкой C:
Если у функции несколько спецификаций компоновки, они должны быть согласованы. Объявление функций как с помощью компоновки C, так и с + + является ошибкой. Кроме того, если два объявления для функции встречаются в программе, одна из которых имеет спецификацию компоновки, а другая — нет, объявление со спецификацией компоновки должно быть первым. Ко всем повторным объявлениям функций, уже имеющих спецификацию компоновки, применяется компоновка из первого объявления. Пример:
extern (C++)
The extern keyword may be applied to a global variable, function, or template declaration. It specifies that the symbol has external linkage. For background information on linkage and why the use of global variables is discouraged, see Translation units and linkage.
The extern keyword has four meanings depending on the context:
In a non- const global variable declaration, extern specifies that the variable or function is defined in another translation unit. The extern must be applied in all files except the one where the variable is defined.
In a const variable declaration, it specifies that the variable has external linkage. The extern must be applied to all declarations in all files. (Global const variables have internal linkage by default.)
extern «C» specifies that the function is defined elsewhere and uses the C-language calling convention. The extern «C» modifier may also be applied to multiple function declarations in a block.
extern linkage for non- const globals
When the linker sees extern before a global variable declaration, it looks for the definition in another translation unit. Declarations of non- const variables at global scope are external by default. Only apply extern to the declarations that don’t provide the definition.
extern linkage for const globals
A const global variable has internal linkage by default. If you want the variable to have external linkage, apply the extern keyword to the definition, and to all other declarations in other files:
extern constexpr linkage
extern «C» and extern «C++» function declarations
In C++, when used with a string, extern specifies that the linkage conventions of another language are being used for the declarator(s). C functions and data can be accessed only if they’re previously declared as having C linkage. However, they must be defined in a separately compiled translation unit.
Microsoft C++ supports the strings «C» and «C++» in the string-literal field. All of the standard include files use the extern «C» syntax to allow the run-time library functions to be used in C++ programs.
Example
The following example shows how to declare names that have C linkage:
If a function has more than one linkage specification, they must agree. It’s an error to declare functions as having both C and C++ linkage. Furthermore, if two declarations for a function occur in a program, one with a linkage specification and one without, the declaration with the linkage specification must be first. Any redundant declarations of functions that already have linkage specification are given the linkage specified in the first declaration. For example:
Русские Блоги
Подробное объяснение ключевого слова extern в C / C ++
1. Измененные внешние переменные и функции
В языке C модификатор extern используется перед объявлением переменной или функции, чтобы указать, что «эта переменная / функция определена в другом месте и должна быть здесь цитирована». Оператор extern не является определением, то есть пространство для хранения не выделяется.
Сначала посмотрите на фрагмент кода
Другими словами, если вы определяете переменные и функции в одном файле, вы можете использовать их в других файлах двумя способами:
2. внешняя функция «C»
Чтобы решить проблему полиморфизма функции при компиляции языка C ++, имя функции и параметры объединяются для генерации промежуточного имени функции, но язык C этого не делает, поэтому во время компоновки нельзя найти соответствующую функцию. В настоящее время C Функции должны быть связаны и указаны с помощью extern «C», который сообщает компилятору, пожалуйста, сохраните мое имя и не генерируйте мне промежуточные имена функций для связывания.
Например, если вы разрабатываете библиотеку DLL на C, чтобы иметь возможность вызывать функцию экспорта DLL на C ++, вам необходимо использовать extern «C», чтобы компилятор не изменял имя вашей функции.
Как правило, в заголовочном файле языка C часто можно увидеть код, подобный следующему:
То есть поместите все объявления функций на место некоторого кода.
нота: Когда вы объявляете функцию отдельно, вы не можете запрашивать файл заголовка или не можете писать extern intThisIsTest (int a, int b) в файле заголовка; в противном случае возникнет ошибка C2732: спецификация ссылки конфликтует с более ранней спецификацией ThisIsTest.
3. Объявите и определите точки знаний
Примечание: в basic_stdy.h есть символ
glob_str []; а в basic_stdy.cpp есть символ
glob_str ; В настоящее время в заголовочном файле нет определения, по умолчанию используется extern.
Стиль программирования: