我有以下代码:
WHERE
Month(StartDate) <= Month(getdate()) AND YEAR(StartDate) <= YEAR(getdate())
AND (
(Month(EndDate) >= Month(getdate()) AND YEAR(EndDate) >= YEAR(getdate()) )
OR EndDate IS NULL
)
我总是收到警告,说变量class circularList
{
public:
circularList() : data(0), next(this) {}
public:
int data;
circularList* next;
};
int main()
{
circularList* root = new circularList;
}
尚未初始化,但是我可以查看是否运行了以指针circularList* next
的地址初始化的代码。
答案 0 :(得分:4)
在示例中,指针已明确初始化。这似乎是编译器错误,因为应该没有警告。您应该将其报告给维护人员。
答案 1 :(得分:3)
这是静态分析器的错误或功能不足。预期的行为是对这样的代码做出反应:
class circularList
{
public:
circularList() : data2(0), data1(this->data2) {}
public:
int data1;
int data2;
};
data2
实际上在data1
之后初始化(这会产生另一个警告),并且以this
,this->XXX
开头的表达式会提示进行检查。在您的情况下,->XXX
不存在,这会使分析仪感到困惑。这应该是一种回归,因为某些较旧的编译器版本(与VS2005或VS2008一样旧),或某些非常古老的gcc
或lcc
(不稳定的版本)也表达了类似的担忧。
仍然存在不应该使用this
的情况-如果存在虚拟继承,或者初始化尝试调用虚拟函数。
答案 2 :(得分:-3)
next(this)
应该是错误的选择,因为在逻辑上这样传递this
时不会创建。也许在构造函数块中使用next = this
。
PS:gcc (GCC) 4.8.5
没有发出任何警告。
class circularList
{
public:
circularList() : data(0) { next = this; }
public:
int data;
circularList* next;
};
int main()
{
circularList* root = new circularList;
std::cout << root->data << "\n";
std::cout << root->next->data << "\n";
root->data = 1;
std::cout << root->data << "\n";
std::cout << root->next->data << "\n";
}