Косые черты и точки в именах функций и прототипах?

Я новичок в C и глядя наИдти'Исходное дерево я нашел это:

https://code.google.com/p/go/source/browse/src/pkg/runtime/race.c

void runtime∕race·Read(int32 goid, void *addr, void *pc);
void runtime∕race·Write(int32 goid, void *addr, void *pc);

void
runtime·raceinit(void)
{
    // ...
}

Что означают косые черты и точки (·) имею в виду? Это действительный C?

 Cornstalks20 нояб. 2012 г., 16:01
Я нене знаю, что они есть, но этоне действует (стандартно) C.

Ответы на вопрос(4)

Решение Вопроса

ВАЖНОЕ ОБНОВЛЕНИЕ:

Окончательный ответ безусловно, тот, который вы получилиот Расса Кокса, один из авторов Go, в списке рассылки golang-nuts. Тем не менее, яЯ оставляю некоторые из моих предыдущих заметок ниже, они могут помочь понять некоторые вещи.

Кроме того, прочитав этот ответ, указанный выше, я считаю, что "псевдо-слэш» теперь можно перевести на обычный/ косая черта (например, миддот переводится в точку) в более новых версиях компилятора Go C, чем та, которую япроверено ниже - но я ненет времени проверить.

Файл скомпилированGo Language Suite 'внутренний компилятор C, который берет свое начало в компиляторе Plan 9 C(1)(2), а такжеимеет некоторые различия (в основном расширения, AFAIK) к стандарту C.

Одним из расширений является то, что он допускает использование символов UTF-8 в идентификаторах.

Теперь в Go Language Suite 'Компилятор Си, символ миддота (·) обрабатывается особым образом, так как он переводится в обычную точку (.) в объектных файлах, что интерпретируется Go Language Suite 'Внутренний компоновщик как символ разделителя пространства имен.

пример

Для следующего файлаexample.c (примечание: оно должно быть сохранено как UTF-8 без спецификации):

void ·Bar1() {}
void foo·bar2() {}
void foo∕baz·bar3() {}

внутренний компилятор C выдает следующие символы:

$ go tool 8c example.c
$ go tool nm example.8
 T "".Bar1
 T foo.bar2
 T foo∕baz.bar3

Теперь, пожалуйста, обратите внимание, ямы дали·Bar1() столицаB, Это потому, что таким образом я могу сделать его видимым для обычного кода Go - потому что он транслируется в тот же символ, что и результат компиляции следующего кода Go:

package example
func Bar1() {}  // nm will show:  T "".Bar1

Теперь, что касается функций, которые вы назвали в вопросе, история идет дальше по кроличьей норе. Я'Я немного менее уверен, если ям прямо здесь, но яЯ постараюсь объяснить, основываясь на том, что я знаю. Таким образом, каждое предложение ниже этого пункта следует читать так, как если бы оно было "НАСКОЛЬКО МНЕ ИЗВЕСТНО" написано только в конце.

Итак, следующий недостающий кусочек, необходимый для лучшего понимания этой головоломки, - это узнать что-то еще о странном"" пространство имен, и как набор Goкомпоновщик обрабатывает это."" пространство имен это то, что мы могли бы назвать "пустой» (так как"" для программиста значитпустая строка) пространство имен, или, может быть, лучше, "заполнитель» Пространство имен. И когда компоновщик видит, что импорт идет так:

import examp "path/to/package/example"
//...
func main() {
    examp.Bar1()
}

тогда он берет$GOPATH/pkg/.../example.a файл библиотеки, и во время фазы импорта заменяет на лету каждый"" сpath/to/package/example, Итак, теперь в связанной программе мы увидим такой символ:

 T path/to/package/example.Bar1
 akavel19 дек. 2016 г., 15:34
@JeffreyBosboom I 'Мы обновили ссылку.
 thwd21 нояб. 2012 г., 22:32
этот ответ потрясающий!
 akavel02 мая 2013 г., 10:41
@Tom: кстати, AFAIK, вы можете изменить принятый ответ на SO, если хотите;)

яторов C, изначально разработанных для plan9. Когда вы строите идти из источника, это 'Сначала я соберу компиляторы plan9, а затем использую их для сборки Go.

Компиляторы plan9 поддерживают имена функций Unicode [1], а разработчики Go используют символы Unicode в своих именах функций в качестве псевдо-пространств имен.

[1] Похоже, что это на самом деле соответствует стандартам:имя переменной g ++ unicode но GCC не делает• Поддержка юникодных функций / имен переменных.

«·» персонаж\xB7 согласно моей консоли Javascript. "∕" персонаж есть.\x2215

Точка попадает вПриложение D изСтандарт С99 перечисляет, какие специальные символы являются допустимыми в качестве идентификаторов в C-источнике. Косая черта некажется, так что я подозреваюиспользуется как что-то другое (возможно, пространство имен) через магию #define или препроцессор.

Это объясняет, почему точка присутствует в действительном определении функции, а косая черта - нет.

Редактировать: ПроверьтеЭтот ответ для некоторой дополнительной информации. Это'Возможно, что косая черта Unicode разрешена GCC 'с реализацией.

gcc а такжеclang жаловаться на точку, даже когда в режиме C99.

Этот исходный код компилируется пакетом компилятора Part 9 (в частности, ./pkg/tool/darwin_amd64/6c в OS X), который загружается системой сборки Go. В соответствии сэтот документВнизу страницы 8, Plan 9 и его компилятор вообще не используют ASCII, но вместо этого используют Unicode. В нижней части страницы 9 указано, что любой символ с достаточно высокой кодовой точкой считается допустимым для использования в имени идентификатора.

Там'Нет никакой магии предварительной обработки - определение функций не соответствует объявлению функций просто потому, что это разные функции. Например,void runtime∕race·Initialize(); является внешней функцией, определение которой содержится в ./src/pkg/runtime/race/race.go; аналогично для.void runtime∕race·MapShadow(…)

Функция, которая появляется позже,void runtime·raceinit(void), это совершенно другая функция, которая очевидна тем, что она на самом деле вызывает.runtime∕race·Initialize();

 John Ledbetter21 нояб. 2012 г., 04:20
Спасибо, полностью пропустил это. Хороший ответ.

Ваш ответ на вопрос