警告:取临时的地址

时间:2016-03-08 09:35:37

标签: c++

我有以下代码段

CREATE TABLE IF NOT EXISTS entries(
entry_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
exam_date DATE NOT NULL,
student_id INT REFERENCES students(student_id),
subject_id INT REFERENCES subjects(subject_id),
PRIMARY KEY(entry_id)
)

所有 #defined为

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

在g ++版本中

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

编译时没有任何警告

但是在g ++版本中

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

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

即使它是一个警告。整个编译消息显示了300多万条消息。这是一个遗留代码。有什么方法可以抑制此警告吗?

修改:

以下是示例代码

warning: taking address of temporary

#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)

2 个答案:

答案 0 :(得分:1)

作为解决方法,您可以实现结构的operator&。然后你不会获取临时的地址,即未定义的行为( UB ),而是调用临时对象的函数,返回指向自身的指针。

暂时只要函数调用就会生存,除非你存储指针并在离开函数后取消引用它,否则不会遇到任何UB

对于你的例子,它将是:

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

答案 1 :(得分:0)

这不是你应该压制的警告。获取临时地址的问题是,当临时超出范围时,您的应用程序会出现未定义的行为。

你有没有理由不将ALL定义为const全局?您可以在没有任何UB的情况下随时取得其地址:

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

const allstruct ALL { "ALL", 3 };