Можно ли определить функцию с другим соглашением о вызовах в c? - PullRequest
1 голос
/ 12 мая 2011
int _cdecl    f (int x) { return 0; }
int _stdcall  f (int y) { return 0; }

После искажения имени будет:

_f
_f@4

Что не противоречит, разрешено ли это в c, если нет, то почему?

Ответы [ 2 ]

4 голосов
/ 12 мая 2011

Ключевые слова _cdecl и _stdcall не являются частью языка Си.Это расширения Microsoft, которым предшествовали аналогичные расширения Borland.

На стандартном языке C нельзя объявить соглашение о вызовах.Каждая объявленная функция, очевидно, эквивалентна тому, что компилятор MS называет соглашением "_cdecl".

Можно было бы использовать встроенную сборку, чтобы различать две функции при их вызове.Поскольку вы используете расширение C для конкретной платформы, вы можете рассмотреть возможность использования встроенной сборки.

1 голос
/ 12 мая 2011

Во-первых, это не калечит, это украшение. Mangling - это то, что происходит с компиляторами C ++, потому что C ++ изначально был разработан для поддержки перегрузки с использованием инструментов ссылок в стиле C.

Что касается вашего вопроса, у вас не может быть двух функций с одинаковым именем. В целях применения этого правила используется неукрашенное имя.

Почему это так? Я думаю, это потому, что соглашения об оформлении и вызовах не являются частью стандарта C и специфичны для каждого компилятора. Я почти уверен, что компиляторы C, поддерживающие множественные соглашения о вызовах, появились всего через несколько лет после изобретения C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...