PDA

Visualizza la versione completa : [C] modificatori funzione?mah!


unbreakable9
09-04-2008, 04:51
Salve gente,

ogni tanto mi piace guardare i sorgenti dei vari progetti opensource e ho notato spesso una dicitura del genere:

typedef int __FASTCALL__ (*funzione)(param1,param2....);

Il mio problema è: quel __FASTCALL__ (ma ce ne sono altre...) che roba è? a occhio e croce sembrerebbe qualche direttiva/istruzione per il compilatore,ma se cosi fosse:

A)Sono operazioni consentite dallo standard ANSI C? Ne minano la portabilità?
B)Fondamentalmente a che servono? in che misura influiscono?
C)Quante ce ne sono? Sono elencate da qualche parte?

Grazie!

XWolverineX
09-04-2008, 07:40
Sono dei modificatori che danno informazioni sul comportamento della funzione.
Se non erro NON sono Ansi C ma sono Microsoft Specifics (ma anche Borland dovrebbe averli).
Ce ne sono 3:



The __fastcall calling convention specifies that arguments to functions are to be passed in registers, when possible.


Informazioni precise sul comportamento (http://msdn2.microsoft.com/en-us/library/6xa169sk(VS.71).aspx)




__cdecl is the default calling convention for C and C++ programs. Because the stack is cleaned up by the caller, it can do vararg functions. The __cdecl calling convention creates larger executables than __stdcall, because it requires each function call to include stack cleanup code. The following list shows the implementation of this calling convention.

Informazioni precise sul comportamento (http://msdn2.microsoft.com/en-us/library/zkwh89ks(VS.71).aspx)



The __stdcall calling convention is used to call Win32 API functions. The callee cleans the stack, so the compiler makes vararg functions __cdecl. Functions that use this calling convention require a function prototype.


Informazioni precise sul comportamento (http://msdn2.microsoft.com/en-us/library/zxk0tw93(VS.71).aspx)

Nei link dice se cambia nome alla variabile, se gli argomenti son passati per riferimento o valore...controlla

andbin
09-04-2008, 09:21
Originariamente inviato da unbreakable9
Il mio problema è: quel __FASTCALL__ (ma ce ne sono altre...) che roba è?Vista come è scritta, tutta maiuscola e con attorno doppi underscore, è sicuramente una macro. Macro che molto probabilmente si "espande" in una direttiva specifica del compilatore, come ad esempio __fastcall di certi compilatori. Se con un certo compilatore non fosse disponibile una direttiva del genere, si può fare facilmente in modo che la macro sia "vuota" (o contenga magari un'altra direttiva in sostituzione).

Loading