簡體   English   中英

無法使用其他翻譯單元的函數指針初始化靜態結構嗎?

[英]Can't initialize static structure with function pointer from another translation unit?

Python文檔聲稱以下內容不適用於“某些平台或編譯器”:

int foo(int);  // Defined in another translation unit.
struct X { int (*fptr)(int); } x = {&foo};

具體來說,Python文檔說:

我們只想將其分配給tp_new插槽,但是出於可移植性的考慮,我們不能在某些平台或編譯器上使用其他C模塊中定義的函數靜態地初始化結構成員。 ,我們將在調用PyType_Ready()之前在模塊初始化函數中分配tp_new插槽。 -http://docs.python.org/extending/newtypes.html

以上是C89和/或C99標准嗎? 哪些編譯器專門無法解決上述問題?

從至少C90開始,已經允許進行這種初始化。

從C90 6.5.7“初始化”開始

具有靜態存儲持續時間的對象的初始化程序中或具有聚合或聯合類型的對象的初始化程序列表中的所有表達式均應為常量表達式。

和6.4“常量表達式”:

地址常量是指向表示靜態存儲持續時間的對象的左值的指針,或者指向函數的指針。 它應使用一元&運算符顯式創建。

但是某些實現肯定有可能在構造上遇到麻煩-我想這對於現代實現而言並非如此。

根據n1570 6.6第9段,函數的地址地址常量,根據6.7.9,這意味着它可用於初始化全局變量。 我幾乎可以肯定,這也是有效的C89。

然而,

在健全的平台上,僅在運行時才知道函數指針(或NULL以外的任何指針)的值。 這意味着直到運行時才能進行結構的初始化。 這並不總是適用於可執行文件,但幾乎總是適用於諸如Python擴展之類的共享對象。 我建議閱讀Ulrich Drepper關於該主題的文章( 鏈接 )。

我不知道它在哪個平台上被破壞,但是如果Python開發人員提到它,那幾乎可以肯定是因為其中一個被它咬了。 如果您真的很好奇,請嘗試查看舊的Python擴展,並查看提交日志中是否有適當的消息。

編輯:看起來大多數Python模塊只是做正常的事情並靜態地初始化類型結構,例如, static type obj = { function_ptr ... }; 例如,查看動態加載的mmap模塊。

該示例絕對符合C99,而AFAIR也符合C89。

如果某個特定的(較舊的)編譯器有問題,我認為建議的解決方案不是解決之道。 不要對運行良好的平台進行動態初始化。 相反,特殊情況下需要特殊處理的怪胎。 並嘗試盡快淘汰它們。

暫無
暫無

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

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