string file = __FILE__ considered harmful (and solution)

rikki cattermole rikki at cattermole.co.nz
Wed May 30 08:29:46 UTC 2018


On 30/05/2018 8:27 PM, FeepingCreature wrote:
> There's a very common idiom where in order to report line numbers of an 
> error or a log line at the callsite of a function, you pass __FILE__ and 
> __LINE__ as default parameters:
> 
> void foo(string file = __FILE__, size_t line = __LINE__);
> 
> What's wrong with this?
> 
> Say you add a string parameter, such as
> 
> void foo(string msg, string file = __FILE__, size_t line = __LINE__);
> 
> foo("Hello World");
> 
> Now when you accidentally grab an old version of the library, your new 
> code will still run, but it will believe that it's being called from 
> file "Hello World", line 15. Not good.
> 
> Luckily there's a fix. Just stick this in some common header file in 
> your project:
> 
> struct CallerInfo
> {
>    string file;
>    size_t line;
> }
> 
> void foo(string msg, CallerInfo caller = CallerInfo(__FILE__, __LINE__));
> 
> Now you cannot accidentally invoke foo with a string, or in fact any 
> type except another instance of CallerInfo.
> 
> This is such a basic type that it really belongs in phobos, arguably 
> object.d. At which point we can shorten this to CallerInfo caller = 
> __CALLER__, and be forward compatible for additional information about 
> the callsite, such as, say, attributes of the calling function.

ooo I have another solution.

Use a named argument[0]!

[0] https://github.com/rikkimax/DIPs/blob/named_args/DIPs/DIP1xxx-RC.md


More information about the Digitalmars-d mailing list