我正在解決一些需要特定版本的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
相同的無宏擴展限制的影響。
有沒有一種理想的方式來將版本字符串連接到錯誤中?
主要是因爲這是別人的代碼,我試圖理解。我收到了這個警告,但是我看不到它的比較和失敗,以確定這是一個語法問題還是構建環境的問題。 –
標準C預處理器中沒有##警告。這是由gcc提供的擴展。該標準沒有提供產生這種診斷消息的方式。 –
@ MikeyT.K:抱歉,無法抗拒:-)你找到它了,但爲什麼不把'o'改成'e'(mitted)? – Olaf