Difference between revisions of "DIP61"
WalterBright (talk | contribs) |
WalterBright (talk | contribs) (Switch to new extern(C++,N) syntax) |
||
Line 27: | Line 27: | ||
== Abstract == | == Abstract == | ||
− | Add | + | Add ability to reference from D C++ symbols that are in C++ namespaces. |
== Rationale == | == Rationale == | ||
Line 37: | Line 37: | ||
A namespace scope creates a scope with a name, and inside that scope all declarations become part of the | A namespace scope creates a scope with a name, and inside that scope all declarations become part of the | ||
namespace scope. This involves the addition of a new keyword 'namespace' and a small amount of new grammar. | namespace scope. This involves the addition of a new keyword 'namespace' and a small amount of new grammar. | ||
− | Compiler changes are expected to be minor. The change is additive and should not impact any existing code | + | Compiler changes are expected to be minor. The change is additive and should not impact any existing code. |
− | + | ||
+ | The namespace is identified by an identifier following the C++ in extern(C++). Nested namespaces can be | ||
+ | specified using . to separate them. | ||
== Usage == | == Usage == | ||
<syntaxhighlight lang="d"> | <syntaxhighlight lang="d"> | ||
− | namespace MyNamespace { int foo(); } | + | extern (C++, MyNamespace) { int foo(); } |
+ | </syntaxhighlight> | ||
+ | |||
+ | creates a namespace named "MyNamespace". As is currently the case, | ||
+ | |||
+ | <syntaxhighlight lang="d"> | ||
+ | extern (C++) { int foo(); } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | does not create a namespace. | ||
+ | |||
+ | The following declarations are all equivalent: | ||
+ | |||
+ | <syntaxhighlight lang="d"> | ||
+ | extern (C++) { extern (C++, N) { extern (C++, M) { int foo(); }}} | ||
+ | extern (C++, N.M) { int foo(); } | ||
+ | extern (C++, N) { extern (C++) { extern (C++, M) { int foo(); }}} | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Line 50: | Line 68: | ||
<syntaxhighlight lang="d"> | <syntaxhighlight lang="d"> | ||
− | + | extern (C++, N) { int foo(); int bar(); } | |
− | + | extern (C++, M) { long foo(); } | |
bar(); // ok | bar(); // ok |
Revision as of 19:52, 27 April 2014
Title: | Add namespace scopes to support calling external C++ functions in C++ namespaces |
---|---|
DIP: | 61 |
Version: | 1 |
Status: | Draft |
Created: | 2014-04-26 |
Last Modified: | 2014-04-26 |
Author: | Walter Bright |
Links: | DIP61/Archive — NG discussion that triggered the DIP |
Contents
Abstract
Add ability to reference from D C++ symbols that are in C++ namespaces.
Rationale
Best practices in C++ code increasingly means putting functions and declarations in namespaces. Currently, there is no support in D to call C++ functions in namespaces. The primary issue is that the name mangling doesn't match. Need a simple and straightforward method of indicating namespaces.
Description
A namespace scope creates a scope with a name, and inside that scope all declarations become part of the namespace scope. This involves the addition of a new keyword 'namespace' and a small amount of new grammar. Compiler changes are expected to be minor. The change is additive and should not impact any existing code.
The namespace is identified by an identifier following the C++ in extern(C++). Nested namespaces can be specified using . to separate them.
Usage
extern (C++, MyNamespace) { int foo(); }
creates a namespace named "MyNamespace". As is currently the case,
extern (C++) { int foo(); }
does not create a namespace.
The following declarations are all equivalent:
extern (C++) { extern (C++, N) { extern (C++, M) { int foo(); }}}
extern (C++, N.M) { int foo(); }
extern (C++, N) { extern (C++) { extern (C++, M) { int foo(); }}}
Namespaces can be nested. Declarations in the namespace can be accessed without qualification in the enclosing scope if there is no ambiguity. Ambiguity issues can be resolved by adding the namespace qualifier:
extern (C++, N) { int foo(); int bar(); }
extern (C++, M) { long foo(); }
bar(); // ok
foo(); // error, ambiguous
N.foo(); // ok
N.bar(); // ok
Name lookup rules are the same as for mixin templates.
Unlike C++, namespaces in D will be 'closed' meaning that new declarations cannot be inserted into a namespace after the closing }. C++ Argument Dependent Lookup (aka "Koenig Lookup") will not be supported.
Copyright
This document has been placed in the Public Domain.