Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
Jurixx
-9 / 0 / 0
Регистрация: 17.12.2014
Сообщений: 119
1

Что означают префиксы "_" и "__"?

05.02.2015, 10:52. Просмотров 898. Ответов 5
Метки нет (Все метки)

Доброго Вам времени суток. Что означают префиксы "_" и "__"?.





З.Ы.: Поиск не знаю для чего нужен, пользоваться не умею и не хочу lol
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.02.2015, 10:52
Ответы с готовыми решениями:

Создать запись "Двигатель", которая содержит элементы "Название", "Мощность", "Скорость", "Цена"
Создать запись "Двигатель", которая содержит элементы "Название", "Мощность", "Скорость",...

Ввести структуру "историческое событие" с полями "число", "месяц", "год", "событие"
Ввести структуру ИСТОРИЧЕСКОЕ СОБЫТИЕ с полями ЧИСЛО, МЕСЯЦ, ГОД, СОБЫТИЕ. Составить и...

Подсчитать общее количество вхождений в строку символов "А", "a", "B" и "b"
#include <stdio.h> #include <string.h> #include <conio.h> main() { int i; int k; ...

"Перевернуть" в строке все слова (Например: "Жили были" в "илиЖ илыб")
"Перевернуть" в строке все слова. (Например: "Жили были дед и баба" - "илиЖ илиб дед и абаб")

Подсчитать количество сдвоенных символов "сс", "нн", "лл" в тексте, расположенном в текстовом файле
Пожалуйста) Подсчитать количество сдвоенных символов сс, нн, лл в тексте, расположенном в текстовом...

5
HighPredator
5693 / 2014 / 723
Регистрация: 10.12.2010
Сообщений: 5,787
Записей в блоге: 3
05.02.2015, 11:15 2
Кратко говоря, эти префиксы означают, что данный идентификатор является зарезервированным. Формальное различие между одинарным и двойным есть только в плюсах. Собственно и встречается если предусмотрена компиляция плюсовым компилятором. За большим количеством подробностей прошу в стандарт С89 параграф 7.1.3 Reserved identifiers.
0
Evg
Эксперт CАвтор FAQ
19789 / 7429 / 560
Регистрация: 30.03.2009
Сообщений: 20,703
Записей в блоге: 30
05.02.2015, 12:31 3
Лучший ответ Сообщение было отмечено Убежденный как решение

Решение

В стандарты языков Си и Си++ включаются библиотеки. Соответственно все библиотечные имена (типа printf или cout) по сути дела являются специальными именами, которые программист должен использовать правильно. Т.е. если программист в исходник своей программы включит функцию с именем printf, которая, например, вычисляет длину строки вместо выполнения печати, то вполне может случиться так, что компилятор сгенерирует некорректный код. Например, компилятор может заменить вызов printf ("abc\n") на puts ("abc"), т.к. в соответствии со стандартом он имеет на это право, хотя по логике афтора программа начнёт работать некорректно

Помимо стандартных имён из технических соображений компилятору приходится формировать дополнительные имена, которые присутсвуют в стандартных инклюдах или библиотеках, но в стандарте про них ничего не сказано. Например, для исходника:

C++
void foo (void)
{
  new int;
}
компилятор g++ сгенерирует код

Код
        subl    $28, %esp
        movl    $4, (%esp)
        call    _Znwj    <----------------
        addl    $28, %esp
Как видим, появился вызов функции, которая находится во внутрикомпиляторной библиотеке и служит для реализации C++'ной конструкции new. Можно было бы каждый раз в месте вызова new помещать длинный код по выделению памяти, но намного проще этот код свалить в библиотеку и строить вызов этой функции.

При такой реализации возникает резонный вопрос, а как назвать функцию. Можно было бы назвать my_new, но ведь у пользователя в программе может быть функция с таким же именем. А пользователь вовсе не знает о том, что компилятор генеририрует вызов такой функции. Поэтому появилось соглашение о том, что все подобные имена, которые используются для дополнительных нужд компилятора или системных библиотек, будут начинаться с символа "_" (подчерк), а пользователю в своей программе нельзя заводить собственных имён, начинающихся с подчекра. Точнее, заводить-то можно, но если возникнет конфликт имён, то сам дурак

Некоторые системные имена начинаются с одного подчерка, некоторые с двух, есть даже с трёх или четырёх. В своё время я пытался увидеть хоть какую-то логику в выборе количества подчерков, но потом плюнул. Вполне возможно, что никакой систематики в этом вопросе нет и люди делают так, как им больше нравится
2
HighPredator
05.02.2015, 14:31
  #4

Не по теме:

Цитата Сообщение от Evg Посмотреть сообщение
Некоторые системные имена начинаются с одного подчерка, некоторые с двух, есть даже с трёх или четырёх. В своё время я пытался увидеть хоть какую-то логику в выборе количества подчерков, но потом плюнул. Вполне возможно, что никакой систематики в этом вопросе нет и люди делают так, как им больше нравится
Про три или четыре не скажу, но про один/два видел следующее:
17.4.3.2.1 Global names [lib.global.names]

Certain sets of names and function signatures are always reserved to the implementation:

-- Each name that contains a double underscore (_ _) or begins with an underscore followed by an uppercase letter (2.11) is reserved to the implementation for any use.
-- Each name that begins with an underscore is reserved to the implementation for use as a name in the global namespace.165
165) Such names are also reserved in namespace ::std (17.4.3.1).

0
Байт
Эксперт C
20290 / 12854 / 2689
Регистрация: 24.12.2010
Сообщений: 26,851
05.02.2015, 14:31 5
Цитата Сообщение от Evg Посмотреть сообщение
В своё время я пытался увидеть хоть какую-то логику в выборе количества подчерков
ИМХО, это количество отражает иерархию Разработчик - Пользователь. Для разработчика компилятора пользователем является программист. И он ему не советует употреблять "_". Но в команде разработчиков компилятора тоже есть своя иерархия. И кто-то разрабатывает нечто, чем пользуется остальные разработчики. И чтобы долго не договариваться об именах, он себе берет "__", а остальным говорит - это мое, не сметь! В итоге количество продчерков определяет, на каком уровне иерархии находится разработчик этих имен.
Конечно, это все мои досужие домыслы...
0
Evg
Эксперт CАвтор FAQ
19789 / 7429 / 560
Регистрация: 30.03.2009
Сообщений: 20,703
Записей в блоге: 30
05.02.2015, 14:35 6
Байт, я раньше тоже пытался выстроить что-то типа такого, но по факту видел, что оно нифига не так

Добавлено через 20 секунд
Точнее, что есть места, что не так
0
05.02.2015, 14:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.02.2015, 14:35

Функция замены ":" на "_" в названии файла и ошибка "undefined reference to 'strcat'"
Добрый день,прошу помочь мне с такой проблемой: В общем есть функция,работающая с именем...

Ввести структуру "Алгебраический полином" с полями "степень", "коэффициенты"
Ребят,вот само задание : Ввести структуру АЛГЕБРАИЧЕСКИЙ ПОЛИНОМ с полями СТЕПЕНЬ, КОЭФФИЦИЕНТЫ....

В строке заменить последовательность слов "один", "два", "три"
Помогите,плз) В строке заменить последовательность слов &quot;один&quot;, &quot;два&quot;, &quot;три&quot; на &quot;1-2-3&quot;


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru