LINUX.ORG.RU

Странность с __stdcall


0

0

Привет всем!

Совершенно ламерский вопрос, наверное... но придется его задать. У меня в классе есть 2 метода:

static void PASCAL Method1();

static int PASCAL Method2();

KDevelop при компиляции выдает следюущее:

/root/prog/router_daemon/src/StringA.h:249: error: variable or field ‘__stdcall’ declared void

/root/prog/router_daemon/src/StringA.h:249: error: expected ‘;’ before ‘Method1’

/root/prog/router_daemon/src/StringA.h:250: error: expected ‘;’ before ‘Method2’

Кто-нибудь может мне объяснить, что это может значить??? В винде такой код компилируется совершенно спокойно...

Использую Cent OS 5.3, KDevelop C/C++.


ой, пардон, вместо PASCAL, естественно, __stdcall

Т. е. вот так:

static void __stdcall Method1();

static int __stdcall Method2();

XJess
() автор топика
Ответ на: комментарий от XJess

>Я ж сказала, я не тот код вставила - я просто с винды переношу код.

Ну линуксе __stdcall нет, везде грубо говоря __cdecl. Так что этот квалификатор нужно убрать. Проще всего сделать пустой макрос __stdcall.

Absurd ★★★
()
Ответ на: комментарий от XJess

>А с чем это связано, что его нет?

В Майкрософт когда-то считали что стиль вызова функций характерный для Паскаля (стек чистит вызываемый) лучше чем стиль вызова функций характерный для Си (стек чистит вызывающий). Разработчики остальных ОС достаточного профита для того чтобы усложнять API не узрели.

Absurd ★★★
()
Ответ на: комментарий от XJess

С тем, что __stdcall нет в стандарте языка С++. В gcc для аналогичной цели используются атрибуты (__attribute__ ((stdcall))). Вообще изменять порядок вызова функции нужно только в очень редких случаях (в отличие в Windows, где в системе стандартным соглашением является __stdcall, а не __cdecl).

Begemoth ★★★★★
()
Ответ на: комментарий от true_admin

>Если не секрет, в чём разница? Или это как bigendian и littleendinan?

Я же написал - в __stdcall(бывший __pascal) стек чистит вызываемый код, в __cdecl - вызывающий. Cdecl конечно логичнее, так как чистить ресурсы должен тот кто их собственно аллокировал. Поэтому __cdecl позволяет передавать переменное число аргументов в функции типа printf, т.к вызываемый код избавлен от необходимости знать количество информации положенной на стек, адресованной лично ему. MS как всегда в носу ковыряет.

Absurd ★★★
()
Ответ на: комментарий от kmeaw

Позволяет, но накладывает доп. ограничение. В гцц оно называется sibling call optimization.

Ur4inA
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.