2016-09-26 29 views
-2

a1.cpp是否可以從另一個翻譯單元訪問靜態變量?

static int a = 20; 

a2.cpp

#include <iostream> 

extern int a; 

int main() { 
    std::cout<<a<<std::endl; // link error 
} 

如果您不能修改a1.cpp,是有可能改變a2.cpp,以便它可以在a1.cpp參觀a ?也許使用程序集?

-------編輯---------

萬一有人有興趣,我終於找到了一種方法來做到這一點:

a1.cpp

static int a = 20; 

a2.cpp

int b = 100; 

int main() { 
    int* p = &b; 
    p--; 
    *p = 42; // now a in a1.cpp is changed from 20 to 42, tested by clang++ 3.8.1 

    return 0; 
} 

我知道這是不是爲static的原因,只是好奇,如果我們可以用地址和偏移破解它。

+0

你的意思是靜態'限定變量或變量_static_存儲持續時間一般?並且不要垃圾郵件標籤。 – Olaf

+0

如果您有指向它的指針,則可以從另一個翻譯單元修改靜態對象。 – EOF

+1

用'static'標記的全局變量具有*內部鏈接*,這意味着它們不會從翻譯單元導出。如果需要從另一個翻譯單元訪問該變量,則該變量需要具有* external linkage *(這是非靜態全局變量的默認值)。 –

回答

1

如果變量是在a1.cppstatic那麼只有a1.cpp可以訪問它直接,它不能由其他單位extern在所有訪問。

大會可以訪問它,但只有如果知道你在運行變量的內存地址。

一般來說,a1.cpp將不得不將指針傳遞給變量a2.cpp(在這種情況下,不需要組件)。但是如果你不能改變a1.cpp這樣做,那麼你幾乎不走運,除非變量碰巧具有可以掃描內存的唯一值。但這不是不太可能。

相關問題