2016-03-08 96 views
-4

服用地址我有下面的代碼片段警告:臨時

if((compare(& key,& ALL)) 

所有已經#defined爲

#define ALL (some_structure){"ALL", 3} 
以g

++版本

g++ (GCC) 4.1.2 20080704 (Red Hat 4.1.2-46) 

編譯沒有任何警告

但在G ++版本

g++ (GCC) 4.4.7 20120313 (Red Hat 4.4.7-4) 

它顯示warning: taking address of temporary

即使它是一個整體warning.the編譯消息顯示aroung 300萬加messages.It是一個傳統的code.is有什麼辦法壓制這個警告?

編輯:

下面是示例代碼

#include <iostream> 

using namespace std; 

typedef struct test { char * name; int id; }tsTest; 

    void print(tsTest * T) { 
    cout<<endl<<"Name :"<<T->name<<endl<<"ID :"<<T->id<<endl; } 

    int main() 
    { 
     print(&(tsTest){"nagaraj",7}); 
     return 0; 
    } 

g++ (GCC) 4.1.2 20080704 (Red Hat 4.1.2-46)

編譯罰款,但在g++ (GCC) 4.4.7 20120313 (Red Hat 4.4.7-4)

temadd.cpp: In function ‘int main()’: 
temadd.cpp:18: warning: deprecated conversion from string constant to ‘char*’ 
temadd.cpp:18: warning: taking address of temporary 
+2

請嘗試創建[最小化,完整和可驗證示例](http://stackoverflow.com/help/mcve)並向我們顯示。在你的問題的代碼中有一些矛盾的信息和語法問題。 –

+0

它是C++嗎? '{| * ALL * |,7}''''''''''''你對運算符重載的嚴重玩法不是嗎? – YSC

+0

像什麼?它顯示錯誤的所有(這是#defined結構) –

回答

1

作爲一種變通方法,您可以實現結構的operator&。那麼你不會接受臨時的地址,那就是未定義的行爲(UB),但調用臨時對象的函數,將指針返回給自己。

臨時將居住只要函數調用,你不會遇到任何UB,除非你存儲的指針,取消引用它留下功能

對於示例後它會像:

typedef struct test { 
    const char * name; 
    int id; 
    test* operator&() { 
    return this; 
    } 
}tsTest; 
+0

UB是什麼意思? –

+1

[未定義的行爲](https://en.wikipedia.org/wiki/Undefined_behavior) – Lol4t0

0

這不是你應該suppr警告ESS。採用臨時地址的問題是,當臨時超出範圍時,您的應用程序將顯示未定義的行爲。

你有沒有任何理由不將ALL定義爲const全局?你可以放心地在任何時間它的地址沒有任何UB:

struct allstruct 
{ 
    char *allname; 
    int somenumber; 
}; 

const allstruct ALL { "ALL", 3 }; 
+0

這並非總是如此。我剛剛給出了一個示例eaxmple –