4 ms·
> C doesn't have optional parameters You are over-nitpicking. It's obvious that the GP meant that you can pass NULL by default if needed.
by huhtenberg 7y ago
> C doesn't have optional parameters
You are over-nitpicking. It's obvious that the GP meant that you can pass NULL by default if needed.
- kazinator 7y agoBut when would that be needed? The argument is optional, and null is its default value. But the way the overloads are collapsed into a single function, there has to be a run-time check for that null. Using a null to indicate "argument is not there" is a C API trick. That parameter won't be optional in C.
- kragen 7y agoIf you only have a K&R-style declaration visible, you can still call it with the wrong number of arguments, but (contrary to what you'd expect from doing the same thing in JS or Lua) most C implementations will instead pass some garbage data as the additional parameter, rather than NULL. Also, most C implementations will allow you to cast function pointers in a way that results in calling the function with the wrong number of arguments. If you're especially unlucky, that garbage data will happen to be NULL at first, but then become non-NULL when you recompile with debugging turned off, resulting in truly fascinating ways to spend your Friday and Saturday nights the month before shipping. (I know you know this, Kaz. I'm mentioning this for the benefit of those who haven't yet spent their Friday and Saturday nights this way.)
- MaulingMonkey 7y agoI'd agree if GP hadn't also used C++-specific optional parameters. Given the minefield that is vendor specific C++ish extensions to C, it seems worth a mention, even if I'm unaware of a compiler vendor that allows default parameters in your C code.
- cozzyd 7y agoIt was just an illustration in C++ (the C version would just document it, obviously). There is no way to do this in a vendor specific way without some sort of name mangling that will hopelessly break the ABI...
- a1369209993 7y agoYes there is: void foo(void* p=0); // has exactly the same ABI as void bar(void* p); bar(); // error: missing parameter foo(); // shorthand for foo(0); // void(*)(void*) is a different type than void(*)(void*=0) // but they can be implicitly converted the same as // eg void* and char*
- cozzyd 7y agohmm I guess so!