3 ms·
According to the OP tweet though, `foo()` is now a function that takes no arguments.
by mojuba 5y ago
According to the OP tweet though, `foo()` is now a function that takes no arguments.
- jesprenj 5y agoWouldn't int foo(void) be a function that takes no arguments and int foo() a function that takes an unknown number of arguments?
- suprjami 5y agoYes, that's the problem.
- suprjami 5y agoThat's a different thing. That's implied `foo(void)`.
- messe 5y agoIt WAS a different thing. That's changing in C23.
- leetrout 5y agoAgree the tweet makes it seem the behavior is changing. Edit: parent is correct it IS changing > We could make this change because foo() decls and definitions had been deprecated since C89/99, longer than I've been alive. > Implementations will likely warn on foo() decls for a while, and error if someone calls it with foo(too, many, args);. https://mobile.twitter.com/__phantomderp/status/1494812595064393731 https://mobile.twitter.com/__phantomderp/status/149481259506...
- zx2c4 5y agoHere's the document for that change: http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2841.htm http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2841.htm > In this proposal, a function declarator without a parameter list declares a prototype for a function that takes no parameters (like it does in C++). And it seems like gcc implements this under -std=c2x now: zx2c4@thinkpad /tmp $ cat a.c int blah() { return 7; } int main(int argc, char *argv[]) { return blah(argc); } zx2c4@thinkpad /tmp $ gcc -std=c17 a.c zx2c4@thinkpad /tmp $ gcc -std=c2x a.c a.c: In function ‘main’: a.c:8:16: error: too many arguments to function ‘blah’ 8 | return blah(argc); | ^~~~ a.c:1:5: note: declared here 1 | int blah() | ^~~~
- duskwuff 5y agoWhich is much more consistent, IMO. int foo(int, int) is a function taking two arguments. int foo(int) is a function taking one argument. int foo() ought to mean a function taking no arguments, not a function with an unspecified number of arguments!