2016-02-11 40 views
2

我正在解決一些需要特定版本的OpenSSL的代碼。如果OpenSSL導出的版本號不夠高,則會返回警告,並關閉程序的各個位。C預處理器警告/錯誤消息中的字符串插值

的代碼看起來是這樣的:

#if OPENSSL_VERSION_NUMBER >= 0x10002000 
     //code here 
#else 
#warning "http_auth_ldap: Compiling with OpenSSL < 1.0.2, certificate verification will be unavailable" 

現在,說我想包括在該消息爲用戶的利益而報道的版本號。

docs for CPP說:

無論#error也不#warning宏觀擴展其參數。內部空白序列每個都被替換爲一個空格。該行必須包含完整的令牌。使這些指令的參數成爲單個字符串常量是明智的;這避免了撇號等問題。

這似乎阻止我將#OPENSSL_VERISON_NUMBER粘貼到郵件末尾。

這段代碼的作者嘗試了字串方法detailed in this question,但它似乎不工作:

#// used for manual warnings 
#define XSTR(x) STR(x) 
#define STR(x) #x 

這就導致了一個警告閱讀:

warning: http_auth_ldap: Compiling with OpenSSL < 1.0.2, certificate verification will be unavailable. OPENSSL_VERSION_NUMBER == OPENSSL_VERSION_NUMBER [-W#pragma-messages]

..和構建失敗。 #pragma message似乎受到與#warning相同的無宏擴展限制的影響。

有沒有一種理想的方式來將版本字符串連接到錯誤中?

+1

主要是因爲這是別人的代碼,我試圖理解。我收到了這個警告,但是我看不到它的比較和失敗,以確定這是一個語法問題還是構建環境的問題。 –

+0

標準C預處理器中沒有##警告。這是由gcc提供的擴展。該標準沒有提供產生這種診斷消息的方式。 –

+0

@ MikeyT.K:抱歉,無法抗拒:-)你找到它了,但爲什麼不把'o'改成'e'(mitted)? – Olaf

回答

1

由於#warrning不可移植,因此您可以嘗試利用其他有關您的實現的知識。

#define cat(a,b) cat2(a,b) 
#define cat2(a,b) a##b 

#define FOO 199 
#define REQUIRED_FOO 200 
#if FOO < REQUIRED_FOO 

void cat(cat(FOO_is_, FOO), 
    cat(_required_FOO_is_, REQUIRED_FOO))() 
{ 
    #warning Busted! 
} 

#endif 

Demo

這裏我利用gcc打印錯誤或警告發生的函數名稱(宏擴展後!)的事實。