Why does 'man 2 open' say that there are two kinds of open?

依然范特西╮ 提交于 2019-12-21 07:04:10

问题


I ran into this question while typing man 2 open. It says that there are two kinds of open, one with two args, and one with three! last time i checked we could not overload functions in C. How did they do this? did they write in C++?

int open(const char * pathname, int flags);
int open(const char * pathname, int flags, mode_t mode);

回答1:


No, they just used variadic function.

int open(const char * pathname, int flags, ...);

This makes the last argument mode optional. The prototypes only show how the function should be used, not the actual interface.

Of course, unlike real overloading, the compiler cannot type-check the mode argument, so the user have to be extra careful to ensure only 2 or 3 arguments are passed, and the 3rd argument must be a mode_t.


BTW, if you check the man 2 open for BSD (including OS X) it shows the correct prototype as above.




回答2:


For what it's worth, the man page is incorrect. The prototypes it shows:

int open(const char * pathname, int flags);
int open(const char * pathname, int flags, mode_t mode);

are not equivalent to the correct prototype:

int open(const char * pathname, int flags, ...);

Using the incorrect ones it provides (e.g. if you prototype the function yourself rather than including the right header) will cause your program to have undefined behavior. (And this is not just theoretical; it will probably fail to run on x86_64 and other platforms with pass-by-register ABIs.)

What the man page was trying to express (and doing a very poor job of) is that the variadic part of open's argument list can be either empty or a single mode_t type argument, where the absence or presence of the optional argument depends on the value of flags.




回答3:


No, they wrote in C, using varargs.

Check out stdarg.h, where there are examples.

A variadic function may read as many arguments as it likes from the ellipsis. Any extra arguments the function "does not want" are in fact discarded.



来源:https://stackoverflow.com/questions/3953895/why-does-man-2-open-say-that-there-are-two-kinds-of-open

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!