簡體   English   中英

將參數推入調用堆棧的可移植方式(C ++)

[英]Portable way to push arguments onto the call stack (C++)

我正在寫一種小型腳本語言。

我正在尋找一種可移植的C ++方法,將參數推入調用堆棧,以便我的函數正常讀取它們。

這可能嗎? 它必須在Visual Studio,XCode和Android Studio中進行編譯-最好使用嵌入在C ++中的asm(不能選擇使用外部匯編器文件)

沒有(我知道)可移植的方法,因為“調用堆棧”不是可移植的。 一台機器可能具有與其他機器不同的調用堆棧實現,例如PIC18器件具有單獨的調用堆棧和變量堆棧,而x86共享將相同的堆棧用於函數和變量並返回值(用非常簡單的話...)。
最好的辦法是為您需要支持的每種體系結構和編譯器創建一個單獨的解決方案(宏或函數),然后使用預處理器條件結構來區分它們。 使用gcc編譯器時,可以使用asm關鍵字 ;在x86體系結構上運行時,可以使用push指令將數據壓入堆棧。
然后,(半) 可移植方式是提供一個API,該API的實現在體系結構和編譯器之間進行更改,如下所示:

// for gcc and clang compiler for x86 architecture
#if defined(__GNUC__) && defined(__i386__)
#define PUSH_VALUE_ONTO_THE_CALL_STACK(val)  do{ \
/* this will break your code, dont use this */ \
int __v = (val); \
__asm__("push %0" : "r" (__v)); \
} while(0)
// for  Visual Studio compiler x86 architecture
#elif defined(_MSC_VER) && defined(__i386__)
#define PUSH_VALUE_ONTO_THE_CALL_STACK(val)  do{ \
/* this will break your code, dont use this */ \
__asm mov eax, val; \
__asm push eax; \
} while(0)
// add more
#elif defined(__PREDEFINED_MACRO_FOR_COMPILER) && defined(__PREDEFINED_MACRO_FOR_ARCHITECTURE)
#define PUSH_VALUE_ONTO_THE_CALL_STACK(val) /* implementation */
// when implementation is missing, issue a error
#else
#error Implementation PUSH_VALUE_ONTO_THE_CALL_STACK not found for Your architecture and compiler.
#endif

int main(void) {
      // identical usage/api between compilers and architectures
      PUSH_VALUE_ONTO_THE_CALL_STACK(5);
      return 0;
 }

希望您能走上正確的道路。
另外:XCode只是IDE的名稱,我認為XCode默認使用clang。 Android Studio 可以使用clang或gcc

AFAIK,沒有可移植的方法。

另外,嵌入在C ++中的asm不可移植,為Win64編譯時,MS Visual Studio不支持它。

解決此問題的一種方法是在C或C ++之上發明一些ABI,適用於您的特定用例和腳本語言。 這可以通過便攜式方式完成而無需組裝。

了解MS如何使用其VBScript,IDispatch和VARIANT數據類型來做到這一點。

我並不是說您必須堅持使用OLE自動化ABI,這只是一個例子。 例如,如果僅將幾個float值傳遞給函數,則可以執行以下操作: int Invoke(IDFunc func, int argc, const float* argv) ,使腳本運行時將函數名稱解析為IDFunc標識符,填充參數數組,並調用調用功能。 然后在互操作的C ++端,調用正確的函數。 您不再需要手動推送參數,只需要分派函數調用,並且有很多解決方法,包括宏,模板,代碼生成或它們的某種組合。

PS IDFunc數據類型為MS OLE int16,但您可以將其作為指向某些內容的指針,這可能有助於實現。

如果您具有C ++ 17,則可移植方式為std :: apply

這是一個演示 ,請參閱Engine \\ Function.hpp源文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM