我有以下代码段
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)
答案 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 };