以下是该计划:
// system call fcntl()
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
/*
* check open file flags.
* @return 0 on succeed, or errno on failed.
*/
int get_file_flags(sync) {
char *fp_out= "/tmp/read_terminal.log";
int fd_out, fd_in;
fd_in = 0; // read from stdin
int flag = O_RDWR | (sync?O_SYNC:0) | O_CREAT | O_APPEND; // append & syncusively
mode_t mode = 0644;
int fd = open(fp_out, flag, mode);
if (fd == -1) {
printf("Failed to open file. Error: \t%s\n", strerror(errno));
return errno;
} else {
printf("Succeed to open file, file descriptor: %d\n", fd);
}
int flags = fcntl(fd, F_GETFL);
if (flags & O_SYNC)
printf("sync flag set\n");
else
printf("sync flag not set\n");
close(fd_out);
return 0;
}
int main(int argc, char *argv[]) {
get_file_flags(0);
get_file_flags(1);
get_file_flags();
return 0;
}
函数get_file_flags
有一个没有类型的参数,默认为int
对吗?
当我在没有通过param的情况下调用函数时,它可以编译。
我偶然得到了这个,但后来我想知道在这种情况下发生了什么。
我的问题是:
通过了什么价值?是NULL
吗?
答案 0 :(得分:2)
这是未定义的行为,完全可以发生任何事情。
但是在实践中可能会发生的事情是编译器不会过时地将任何东西传递给函数,因此get_file_flags
会读取你调用它时发生的任何值。
只需编译代码并查看呼叫站点即可轻松检查:
movl $0, %edi
movl $0, %eax
call get_file_flags
movl $1, %edi
movl $0, %eax
call get_file_flags
movl $0, %eax
call get_file_flags
在这里,您可以在main中看到3个函数调用。前两次0和1通过,第三次没有特别通过。该值将是此时%edi
中发生的任何事情。
但同样,这是未定义的行为。你永远不应该依赖于此或假设可能发生的事情。
答案 1 :(得分:1)
您必须传递参数,因为get_file_flags
使用sync
。否则,您将拥有未定义的行为。但是MSVC没有给出任何警告或错误。
#include <stdio.h>
void get_file_flags(sync) {
printf ("%d\n", sync);
}
int main(void) {
get_file_flags(5);
get_file_flags();
return 0;
}
节目输出:
5
1638280