2010-06-30 90 views
0

有沒有辦法在編譯時檢查(assert)?const char *是否包含空格?靜態檢查const char *包含空格

喜歡的東西:

const char* cstr1 = "ok"; 
const char* cstr2 = "very bad"; 

check(cstr1); //OK 
check(cstr2); //Fail to compile 

的類型是相同的,但有可能定義一些棘手的模板元編程tecnique做到這一點。

要點是,所需的所有信息都是在編譯時固定的。

此問題應該與「從常量字符變量到類型」問題有關,我認爲這可以通過元編程技術通過編譯時散列來解決。

非常感謝您的幫助。

+0

你的意思是你想檢查一個字符串文字?你的例子絕對不行; 'check(「very bad」);'不太可能,但我仍然認爲沒有辦法做到這一點 – 2010-06-30 18:15:34

回答

4

不能使用普通的字符串,因爲他們的角色不能被模板訪問,但是你可以使用MPL字符串:

#include <boost/mpl/char.hpp> 
#include <boost/mpl/string.hpp> 
#include <boost/mpl/contains.hpp> 
#include <boost/utility/enable_if.hpp> 

typedef boost::mpl::char_<' '> space; 
typedef boost::mpl::string<'o', 'k'> cstr1; 
typedef boost::mpl::string<'v', 'e', 'r', 'y', ' ', 'b', 'a', 'd'> cstr2; 

boost::disable_if< boost::mpl::contains<cstr1, space> >::type check(); 
// boost::disable_if< boost::mpl::contains<cstr2, space> >::type check(); 

第二行編譯失敗。

+0

那些'disable_if'對於工作來說是錯誤的工具,至少它傳達了錯誤的意圖 - 只是使用例如'BOOST_STATIC_ASSERT'來獲得簡單的編譯時錯誤。 – 2010-07-01 15:38:38

+0

這是最接近我想達到的,謝謝! – stepelu 2010-07-02 18:07:48

2

問題是你在編譯時不知道cstr

int i = function_call(); 
const char* cstr = NULL; 

if(i > 0) 
{ 
    cstr = "hello"; 
} 
else 
{ 
    cstr = "ciaooo"; 
} 

考慮上面的例子。編譯器現在不會在運行時假定值const char* cstr

基本上我會說你不能在編譯時做這樣的檢查。

請注意,儘管聲明爲const,但這並不意味着變量cstr是恆定的。請注意,指針類型是const。你必須這樣讀:(const char)* cstr。這意味着你不能執行這樣的操作cstr[0] = 's';

純常數會聲明如下:

const char * const CONSTANT = "test"; 

一個新的任務將在編譯時失敗。即使你使用這種方法,我也不認爲有可能在編譯時評估常量的內容。

+0

這是有道理的,謝謝你指出這一點! – stepelu 2010-07-02 18:08:08

2

我不這麼認爲。如果可能的話,編譯器如何設法檢查這個問題?

const char* cstr3 = some_dynamic_function(); 

check(cstr3); 
1

編寫一個腳本,用於檢查您關心的字符串文字,如果它們中的任何一個有空格,則會失敗。

在構建過程中運行此腳本。

使構建過程的成功取決於腳本的成功。