gpt4 book ai didi

c 函数 - 调用具有无类型参数的函数,并忽略该参数

转载 作者:太空宇宙 更新时间:2023-11-04 01:59:05 24 4
gpt4 key购买 nike

程序如下:

// 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 对吧?当我在不传递参数的情况下调用该函数时,它可以编译。

我偶然得到这个,但后来我想知道在这种情况下发生了什么。

我的问题是:

传递了什么值?它是 NULL 吗?

最佳答案

这是未定义的行为,实际上任何事情都有可能发生。

但实际上可能会发生的情况是,编译器不会特意将任何东西传递给函数,因此 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 中的任何值。

但同样,这是未定义的行为。您永远不应依赖于此或对可能发生的事情做出任何假设。

关于c 函数 - 调用具有无类型参数的函数,并忽略该参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29643971/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com