答案 0 :(得分:38)
L
指定该数字为long
类型,因此-1L
是long
设置为负数,1L
是long
1}}设置为正数。
至于为什么ftell
不仅仅返回NULL
,这是因为NULL
用于指针,这里返回long
。请注意,0
未被使用,因为0
是ftell
返回的有效值。
捕获这种情况涉及检查非负值:
long size;
FILE *pFile;
...
size = ftell(pFile);
if(size > -1L){
// size is a valid value
}else{
// error occurred
}
答案 1 :(得分:6)
ftell()返回类型 long int ,应用于文字的L后缀强制其类型为 long 而不是普通 int 。< / p>
NULL将完全不正确,因为它是表示指针而不是整数的宏。解释时它的值和整数可以表示有效的文件位置,而-1(或任何负值)则不能。
对于所有意图和目的,您通常可以简单地将错误返回视为-1,由于隐式转换规则,L后缀在大多数情况下对于正确操作并不重要
答案 2 :(得分:4)
这意味着将值返回为long,而不是int。
答案 3 :(得分:2)
这意味着-1为长(而不是数字的默认类型,即整数)
答案 4 :(得分:2)
-1
中格式化的{p> long int
是-1L
。为什么不简单NULL
?因为此函数中的NULL
是正常结果,也无法识别错误。为什么此函数中的NULL
是正常结果?因为NULL == 0
和ftell
返回流中的位置,所以当你在流函数的开始时返回0
并且这是正常结果而不是错误,那么如果你将这个函数与{{ 1}}检查错误,当你在流中的起始位置时,你会收到错误。
答案 5 :(得分:1)
今天编辑意味着仍需要更多细节。
马克说得对。 “L”后缀很长。因此-1L是长-1。我最喜欢的测试方式与Marks不同,这是一个偏好而不是善良的问题。
if ( err >= 0L ) success else error
按照一般习惯,我不喜欢寻找显式-1。如果将来弹出-2,我的代码可能不会中断。
自从我开始使用C之后,回到C的开头,我注意到大多数返回 int 值的库例程返回0表示成功,-1表示错误。最。
整数函数通常不返回NULL,因为NULL是指针值。除了类型的冲突之外,不返回NULL的一个重要原因取决于一些历史。
当C被发明时,事情并不干净,甚至可能在今天的小型系统上都没有。原始K&amp; R C不保证NULL将为零,因为具有虚拟内存的CPU通常是这种情况。在小“实际存储器”系统上,零可以是有效地址,使得“无效”地址必须移动到某个其他OS相关位置。这样的确会被CPU接受,而不是在正常的方案中生成。也许是一个非常高的内存地址。我甚至可以看到一个名为extern const long NULL[1];
的隐藏数组,允许NULL成为这个未使用的数组的地址。
当时你看到很多if ( ptr != NULL )
语句,而不是if ( ptr )
,对于那些认真编写可移植代码的人来说。