2016-02-27 23 views
3

我需要從一個範圍內生成一個隨機整數,並發現非常有趣的是在@Walter的答案中討論here。但是,它是C++11標準,我需要使用C,有沒有辦法從C打電話?我複製他的答案在這裏:可以從C例程中調用隨機的C++ 2011標準函數嗎?

#include <random> 

std::random_device rd;  // only used once to initialise (seed) engine 
std::mt19937 rng(rd()); // random-number engine used (Mersenne-Twister in this case) 
std::uniform_int_distribution<int> uni(min,max); // guaranteed unbiased 

auto random_integer = uni(rng); 

回答

5

你也不會在C使用C++類,但可以包裝在函數的C++功能,它可以從C,例如被稱爲在getrandom.cxx:

#include <random> 

static std::random_device rd; 
static std::mt19937 rng(rd()); 
static std::uniform_int_distribution<int> uni(min,max); 

extern "C" int get_random() 
{ 
    return uni(rng); 
} 

這是一個C++模塊與出口C鏈接一個get_random函數(即,從C調用您在getrandom.h聲明它:

extern "C" int get_random(); 

和可以調用它從你的C代碼。

+0

我已經在getrandom.cpp寫的'C++代碼'創造與聲明中的getrandom.h文件,然後試圖編譯'#包括 的#include 的#include #include「getrandom.h」 int main() printf(「%i \ n」,get_random()); } '但它不起作用,我做錯了什麼? – nopeva

+1

@ AP13'get_random'聲明結尾缺少分號。你已經修好了嗎?你會得到一個編譯器或運行時錯誤? –

+0

@Martin Zabel謝謝,是的,我終於明白了。代碼編譯好但鏈接不好。 – nopeva

1

extern "C"聯動總結這一切,在C++函數。

3

如果要從C代碼調用C++代碼,可以將代碼包裝在extern "C"塊中。函數簽名必須是有效的C函數,然後可供C代碼調用。但是,函數的內容可以包含任何您想要的C++ - 主題。

詳情參見這個問題:In C++ source, what is the effect of extern "C"?