我运行以下程序。我预计它会给出错误。但它完美运行并提供输出。
程序:
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
int main()
{
int fd, retval;
char wBuf[20] = "Be my friend", rBuf[20] = {0};
fd = open("test.txt", O_RDWR | O_CREAT, 0666);
write(fd, wBuf, strlen(wBuf));
retval = lseek(fd, -3L, SEEK_END); //Observe 2nd argument
if(retval < 0) {
perror("lseek");
exit(1);
}
read(fd, rBuf, 5);
printf("%s\n", rBuf);
}
lseek
也适用于
lseek(fd, -3I, SEEK_END); //but didn't print anything
对于其他字母,它会给出错误,如
error: invalid suffix "S" on integer constant
lseek上L
和I
的含义是什么?
答案 0 :(得分:2)
L
只是意味着常量将被视为long
类型而不是默认的整数类型。
I
不是标准的C后缀,因此,除非您的编译器具有某种扩展名(a),否则它不应该有效。 可能是因为大写l
而误认为是小写L
(与I
相同),尽管在这种情况下,我怀疑它仍然会寻找,阅读和打印,这似乎表明它没有。
事实上,我能想到你可以在标准C中使用I
并且不打印任何内容的唯一方法就是:
#define I * 0
可以有效地将lseek
参数转换为零。
(a)例如gcc及其复杂的数据类型,可能就是这种情况。将其中一个传递给lseek
的效果最多可能是功能失调。
也许这是尝试寻找文件中的特定角色位置,然后也寻找与该位置成直角: - )
答案 1 :(得分:0)
字面数字上的L后缀仅表示数字类型为long
而非默认值int
123 //this is an int
123L //this is a long
I后缀是complex/imaginary numbers的gcc扩展名。
123; //this is an int
123I; //this is a _Complex
在C中,整数常量有以下后缀(它们不区分大小写)
l
很长时间,ll
很长一段时间。 u
表示无符号对于浮点常数:
f
浮动。 l
for long double (以及特定编译器可能支持的任何扩展。)