Это не совсем встроенный asm, как в инструкциях , это просто переопределение искажения имен для имен символов. (Например, static int foo
в MacOS обычно имеет символьное имя _foo
. Например, в выводе asm компилятора у вас будет _foo: .long 0
).
В GNU C int foo asm("foobar");
имеет имя символа asm из foobar
вместо значения по умолчанию _foo
. См. https://gcc.gnu.org/onlinedocs/gcc/Asm-Labels.html и этот SO-ответ: Добавление начальных подчеркиваний к символам сборки с помощью GCC на Win32?
Попробуйте сами на https://godbolt.org/, если вам интересно.
В этом случае у нас есть C строка конкатенации строк препроцессора из расширений макросов. например,
"_" "telldir" "_ino64"
в точности соответствует "_telldir_ino64"
во всех контекстах, включая
long telldir(DIR *dirp) asm("_" "telldir" "_ino64");
. Этот вариант использования, по-видимому, выбирает реализацию telldir
в libcустановив имя на основе нескольких других макросов CPP. Таким образом, если __DARWIN_SUF_64_BIT_INO_T
определено как "_ino64"
, а __DARWIN_SUF_UNIX03
определено как пустое или /**/
, тогда для имени символа будет установлено значение "_telldir_ino64"
(понятия не имею, как MacOS обычно определяет эти символыдругие макросы, но синтаксис отображаемой строки - просто конкатенация строковых литералов внутри asm("")
для установки имени символа.)