我尝试编译以下示例代码:
#include <iostream>
#include <stdio.h>
#include <string>
using namespace std;
int main ()
{
if (strlen <= 0) {
cout << "trace1" << endl;
return 0;
}
cout << "trace2" << endl;
return 0;
}
奇怪的是它成功编译。你知道为什么吗?
我没有将strlen声明为变量。
答案 0 :(得分:4)
仅使用函数的标识符衰减到相应类型的函数指针。在这种情况下,strlen
是size_t (*)(const char *)
类型的指针。该指针保存可执行代码中函数的第一条指令的地址。
测试该指针的值是合法的,无论原因是什么,尽管在您提供的代码片段中它似乎很奇怪。
答案 1 :(得分:3)
没有()的strlen给你一个函数指针,指向在内存中分配strlen函数的地址。
如果库函数strlen的分配地址小于0,程序将打印“trace1”,这在世界上的每台计算机上都是不可能的,或者如果它在地址0处分配(极不可能但可能)。否则,如果strlen的分配地址大于零(很可能是这种情况),则会打印“trace2”。
答案 2 :(得分:2)
它可能衰变成一个衰变为整数的地址。一个真正的编译器可能会在屏幕上显示警告。
答案 3 :(得分:1)
如果对strlen
以外的其他函数执行相同操作,此示例代码将打印trace2,因为strlen
是指向函数size_t strlen ( const char * str )
的指针,它的值应为正数。< / p>
cout << (size_t *) strlen << endl;
cout << (size_t *) strcat << endl;
例如上面的代码打印:
0x7fff84d29110
0x7fff84d63953
在我的机器上(因为你看到它们是正数,因为它们以7开头)。
此外,如果我在不转换为(size_t *)的情况下打印strlen
和strcat
,结果将为1,这意味着这些函数有效。