2012-09-20 132 views
4
#define LOG(format,...) Logger::Log(format,__VA_ARGS__) 
#define STRIP(netIp) GeneralUtils::inet_ntop_(netIp) 
string GeneralUtils::inet_ntop_(unsigned int netIp){ 
    char strIP[INET_ADDRSTRLEN]; 
    in_addr sin_addr; 
    sin_addr.s_addr = netIp; 
    inet_ntop(AF_INET, &sin_addr.s_addr, strIP, sizeof strIP); 
    return string(strIP); 
} 

打電話來時:C++傳遞字符串可變參數

LOG("src %s dst %s" ,STRIP(src_ip_)); 

我得到的編譯錯誤:

cannot pass objects of non-trivially-copyable type ‘std::string {aka struct std::basic_string<char>}’ through ‘...’ 

據我所知,可變參數爲c兼容,所以我不能發送字符串給它。 有沒有簡單的方法來繞過它? 會不會是正確的解決這樣的:

#define STRIP(netIp) GeneralUtils::inet_ntop_(netIp).data() 
+1

而不是在'STRIP'宏中使用'data'(或'c_str'),你可以在LOG調用中使用它:LOG(「src%s dst%s」,STRIP(src_ip_))。 '# –

+1

@Joachim Pileborg我preffer修復一個地方,並不是所有的這個調用放到LOG –

回答

4
#define STRIP(netIp) GeneralUtils::inet_ntop_(netIp).data() 

錯誤,它會調用未定義的行爲,因爲它不包括終止零。使用

#define STRIP(netIp) GeneralUtils::inet_ntop_(netIp).c_str() 

改爲。

+0

你能解釋'未定義的行爲'嗎?當我改變爲inet_ntop_(netIp).data() –

+2

@ user1495181時,我沒有遇到任何問題'%s'格式說明符預期爲零終止的C字符串。 'std :: string.data()'返回一個非零終止的C字符串,***會在某天崩潰,這就是爲什麼你必須使用'c_str()'。 – 2012-09-20 16:18:33

+0

我的代碼充滿格式%s和data()作爲返回,我從來沒有崩潰在此。你能解釋一下我會在哪些情況下崩潰。 –

5

您可以通過const char *而不是std::string。你可以把它從std::string通過調用c_str()

+0

這樣所有的日誌調用都需要一個醜陋的.c_str()。我認爲最好在一個地方定義這個 –

相關問題