C++ 为什么允许将int-literal设置为指针,但不允许比较?
这是完整的代码。它是我自制的单元测试框架的一部分C++ 为什么允许将int-literal设置为指针,但不允许比较?,c++,C++,这是完整的代码。它是我自制的单元测试框架的一部分 #include <iostream> #define IS(arg1, arg2) is(arg1, arg2, #arg1 " == " #arg2) template<typename T1, typename T2> void is(T1 value, T2 expect, const char* desc) { if (value == expect) { std::cout
#include <iostream>
#define IS(arg1, arg2) is(arg1, arg2, #arg1 " == " #arg2)
template<typename T1, typename T2>
void is(T1 value, T2 expect, const char* desc)
{
if (value == expect)
{
std::cout << "ok " << " - " << desc << std::endl;
}
else
{
std::cout << "NOT ok " << " - " << desc << std::endl
<<" got " << value <<", expect "<< expect << " " << std::endl;
}
}
struct Foo
{};
int main(int argc, char** argv)
{
Foo* foo = 0;
IS(foo, 0);
}
这是因为实际比较发生在指针和int变量之间吗?可能您没有显示当前正在执行的操作,这就是为什么您应该提供WhozCraig所指出的警告级别和正在使用的设置。也许你想比较foo_p指出的值,这可能是一个陷阱,因为你实际上是在比较地址:
if (foo_p == 0) {}
如果要比较foo_p所指的值,必须执行以下操作:
if (*foo_p == 0) {}
编辑:
错误是您试图将指针与int变量进行比较:
ISO-C++禁止指针与整数[fPrime]
的比较由于指针是一个结构,不能与int文本进行比较。
0在C++中是特殊的,除了作为int文字外,它也意味着空指针,因此可以将它赋值给指针,并将它与指针进行比较,例如:
Foo* pf = 0;
if (pf == 0) {}
顺便说一句,在c++11中最好使用nullptr而不是0
但是int和pointer是不同的类型,因此您不能直接分配或比较它们:
int i = 0;
Foo* pf = i; // compile error
if (pf == i) {} // compile error
在您的例子中,T1是Foo*,T2是int,它们不能直接进行比较。文本0是指针或整数文本,具体取决于它的使用方式。当0被赋值或与指针进行比较时,它被视为指针文字。在其他上下文中,例如,在模板中推断其类型时,它被推断为int,并且与指针不兼容。也就是说,你可以使用
Foo* pf = 0;
if (pf == 0) {}
。。。但你不能使用
完全避免这个问题的最简单的方法是不使用0作为空指针文字,而是使用Null pTr.< /P>如果这对任何C++编译器都不起作用,编译器是错误的。您可能希望包括警告级别和使用的设置,以及可重复的完整代码示例,因为这应该工作。如果foo_p==0`是完全有效的;0是空指针常量。请复制并粘贴生成错误消息的确切代码行。答案是,您根本没有将指针与int文本进行比较,而是将其与int变量进行比较。我使用的是没有nullptr的C++03
Foo* pf = 0;
if (pf == 0) {}
auto null = 0;
Foo* pf = null; // ERROR
if (pf == null) {} // ERROR