例如,考虑 Windows。
如您所知,翻译器可以通过寄存器或堆栈将参数传递给函数。当整个项目使用相同的广播密钥进行广播时,一切都清楚了。但是,比如项目有一个*.lib库,通过寄存器接受一些函数的参数,整个项目通过堆栈接受函数参数。编译器如何理解某些库函数需要以不同方式调用?
例如,考虑 Windows。
如您所知,翻译器可以通过寄存器或堆栈将参数传递给函数。当整个项目使用相同的广播密钥进行广播时,一切都清楚了。但是,比如项目有一个*.lib库,通过寄存器接受一些函数的参数,整个项目通过堆栈接受函数参数。编译器如何理解某些库函数需要以不同方式调用?
编译器必须从函数声明中清楚地了解传递参数的方式和调用约定的其他细节。
如果在编译器从现有库函数声明中推断出不同的调用约定时翻译了库,则该库通常将不可用。
在某些情况下,可以定制“新”编译器的函数声明以正确调用“旧”代码。一个教科书的例子是标准 C 库从 K&R 声明到带有原型的现代声明的过渡,结果标准函数的原型被调整为 K&R 调用约定:“经典”函数的所有参数声明都被考虑在内帐户默认参数促销,即 不要使用类型
char和。shortfloat