簡體   English   中英

如何在C ++中限制對靜態變量的訪問?

[英]How to restrict access to static variables in C++?

我有一個名為“ count”的C函數,如下所示:

void count(){ 
  static int c = 0;
  printf("Counter=%i", c);
  c++;
}

此外,我有一個Cpp對象向量,每個對象都稱為“計數”函數。 由於計數器變量是靜態的,因此由一個對象進行的調用也會增加所有其他對象的計數器值。 我實際想要的是給每個對象一個專用的計數器,因為“ count”功能是“ Device-Under-Test”,並且可能不會更改。 我認為使用命名空間應該有可能...有什么想法嗎?


我最初的想法是使用名稱空間...

namespace c1 {
#ifdef __cplusplus
  extern "C" {
#endif
    #include "count.h"
#ifdef __cplusplus
  }
#endif
}

namespace c2 {
#ifdef __cplusplus
  extern "C" {
#endif
    #include "count.h"
#ifdef __cplusplus
  }
#endif
}

然后像這樣從Cpp-Object內調用...

if (objNr == 1) c1::count();
else if (objNr == 2) c2::count();
...

它對我不起作用。 知道為什么嗎?

所要求的問題無法解決。 如果該函數不可修改,則無法開始計數單個實例。

具有static 存儲類的變量(例如您的示例中的變量)是全局的,這意味着程序中的任何位置都只有一個副本。 這與它們的鏈接無關,后者確定從哪里可以引用它們。 無論其存儲類如何,函數的局部變量都沒有鏈接,這意味着只能從函數體內直接訪問它們。

如果您不能修改該函數,則它無法使變量c在其他位置可訪問(例如,通過公開指向它的指針),因此測試例程沒有其他選擇,例如,在測試之間或在測試之間重置其值。讀出來。 因此,如果不同的測試對象必須具有該特定變量的自己的副本,則可以得出結論,它們必須具有包含該變量的函數的自己的副本。

最簡單,最通用的實現方法是在單獨的程序中運行每個測試對象。 也可以玩游戲,例如動態加載和卸載包含該函數的庫(每個@VadimKey),但這取決於標准C或C ++之外的功能,這使測試環境與大多數該功能可能會在其他環境中看到。

否則,如果多個對象必須在同一測試程序的同一運行中運行測試,則無法使它們具有函數靜態變量的私有副本。 最好的選擇可能只是構造測試以適應這種情況。

如果可以訪問源代碼,請以某種方式對其進行更改,以使此計數器變為外部。 要么將其作為參數傳遞,要么創建一個以counter為成員的類。

如果您無法使用此函數更改源代碼,則可以創建帶有單獨計數器的包裝器類。

暫無
暫無

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

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