Report a bug
If you spot a problem with this page, click here to create a Bugzilla issue.
Improve this page
Quickly fork, edit online, and submit a pull request for this page.
Requires a signed-in GitHub account. This works well for small changes.
If you'd like to make larger changes you may want to consider using
a local clone.
core.attribute
This module contains UDA's (User Defined Attributes) either used in
the runtime or special UDA's recognized by compiler.
License:
Authors:
Jacob Carlborg
Source core/attribute.d
- struct
selector
; - Use this attribute to attach an Objective-C selector to a method.This is a special compiler recognized attribute, it has several requirements, which all will be enforced by the compiler:
- The attribute can only be attached to methods or constructors which
have Objective-C linkage. That is, a method or a constructor in a
class or interface declared as
extern(Objective-C)
. ,
- It cannot be attached to a method or constructor that is a template ,
- The number of colons in the string need to match the number of arguments the method accept. ,
- It can only be used once in a method declaration
Examples:extern (Objective-C) class NSObject { this() @selector("init"); static NSObject alloc() @selector("alloc"); NSObject initWithUTF8String(in char* str) @selector("initWithUTF8String:"); ObjcObject copyScriptingValue(ObjcObject value, NSString key, NSDictionary properties) @selector("copyScriptingValue:forKey:withProperties:"); }
- The attribute can only be attached to methods or constructors which
have Objective-C linkage. That is, a method or a constructor in a
class or interface declared as
- enum
optional
; - Use this attribute to make an Objective-C interface method optional.An optional method is a method that does not have to be implemented in the class that implements the interface. To safely call an optional method, a runtime check should be performed to make sure the receiver implements the method. This is a special compiler recognized attribute, it has several requirements, which all will be enforced by the compiler:
- The attribute can only be attached to methods which have Objective-C linkage. That is, a method inside an interface declared as extern (Objective-C)
- It can only be used for methods that are declared inside an interface
- It can only be used once in a method declaration
- It cannot be attached to a method that is a template
Examples:import core.attribute : optional, selector; extern (Objective-C): struct objc_selector; alias SEL = objc_selector*; SEL sel_registerName(in char* str); extern class NSObject { bool respondsToSelector(SEL sel) @selector("respondsToSelector:"); } interface Foo { @optional void foo() @selector("foo"); @optional void bar() @selector("bar"); } class Bar : NSObject { static Bar alloc() @selector("alloc"); Bar init() @selector("init"); void bar() @selector("bar") { } } extern (D) void main() { auto bar = Bar.alloc.init; if (bar.respondsToSelector(sel_registerName("bar"))) bar.bar(); }
- struct
gnuAbiTag
; - Use this attribute to declare an ABI tag on a C++ symbol.ABI tag is an attribute introduced by the GNU C++ compiler. It modifies the mangled name of the symbol to incorporate the tag name, in order to distinguish from an earlier version with a different ABI. This is a special compiler recognized attribute, it has a few requirements, which all will be enforced by the compiler:
- There can only be one such attribute per symbol. ,
- The attribute can only be attached to an extern(C++) symbol (struct, class, enum, function, and their templated counterparts). ,
- The attribute cannot be applied to C++ namespaces. This is to prevent confusion with the C++ semantic, which allows it to be applied to namespaces. ,
- The string arguments must only contain valid characters for C++ name mangling which currently include alphanumerics and the underscore character. ,
gnuAbiTag
("c", "b", "a") will appear as @gnuAbiTag
("a", "b", "c").See Also:Examples:// ---- foo.cpp struct [[gnu::abi_tag ("tag1", "tag2")]] Tagged1_2 { struct [[gnu::abi_tag ("tag3")]] Tagged3 { [[gnu::abi_tag ("tag4")]] int Tagged4 () { return 42; } } } Tagged1_2 inst1; // ---- foo.d @gnuAbiTag("tag1", "tag2") struct Tagged1_2 { // Notice the repetition @gnuAbiTag("tag1", "tag2", "tag3") struct Tagged3 { @gnuAbiTag("tag1", "tag2", "tag3", "tag4") int Tagged4 (); } } extern __gshared Tagged1_2 inst1;
Copyright © 1999-2022 by the D Language Foundation | Page generated by
Ddoc on (no date time)