ccmode: Class Symbols
10.2.2 Class related Symbols
----------------------------
Here’s an example which illustrates some C++ class syntactic symbols:
1: class Bass
2: : public Guitar,
3: public Amplifiable
4: {
5: public:
6: Bass()
7: : eString( new BassString( 0.105 )),
8: aString( new BassString( 0.085 )),
9: dString( new BassString( 0.065 )),
10: gString( new BassString( 0.045 ))
11: {
12: eString.tune( 'E' );
13: aString.tune( 'A' );
14: dString.tune( 'D' );
15: gString.tune( 'G' );
16: }
17: friend class Luthier;
18: };
As in the previous example, line 1 has the ‘topmost-intro’ syntax.
Here however, the brace that opens a C++ class definition on line 4 is
assigned the ‘class-open’ syntax. Note that in C++, classes, structs,
and unions are essentially equivalent syntactically (and are very
similar semantically), so replacing the ‘class’ keyword in the example
above with ‘struct’ or ‘union’ would still result in a syntax of
‘class-open’ for line 4 (1). Similarly, line 18 is assigned
‘class-close’ syntax.
Line 2 introduces the inheritance list for the class so it is
assigned the ‘inher-intro’ syntax, and line 3, which continues the
inheritance list is given ‘inher-cont’ syntax.
Hitting ‘C-c C-s’ on line 5 shows the following analysis:
((inclass 58) (access-label 58))
The primary syntactic symbol for this line is ‘access-label’ as this is
a label keyword that specifies access protection in C++. However,
because this line is also a top-level construct inside a class
definition, the analysis actually shows two syntactic symbols. The
other syntactic symbol assigned to this line is ‘inclass’. Similarly,
line 6 is given both ‘inclass’ and ‘topmost-intro’ syntax:
((inclass 58) (topmost-intro 60))
Line 7 introduces a C++ member initialization list and as such is
given ‘member-init-intro’ syntax. Note that in this case it is _not_
assigned ‘inclass’ since this is not considered a top-level construct.
Lines 8 through 10 are all assigned ‘member-init-cont’ since they
continue the member initialization list started on line 7.
Line 11’s analysis is a bit more complicated:
((inclass 58) (inline-open))
This line is assigned a syntax of both ‘inline-open’ and ‘inclass’
because it opens an “in-class” C++ inline method definition. This is
distinct from, but related to, the C++ notion of an inline function in
that its definition occurs inside an enclosing class definition, which
in C++ implies that the function should be inlined. However, if the
definition of the ‘Bass’ constructor appeared outside the class
definition, the construct would be given the ‘defun-open’ syntax, even
if the keyword ‘inline’ appeared before the method name, as in:
1: class Bass
2: : public Guitar,
3: public Amplifiable
4: {
5: public:
6: Bass();
7: };
8:
9: inline
10: Bass::Bass()
11: : eString( new BassString( 0.105 )),
12: aString( new BassString( 0.085 )),
13: dString( new BassString( 0.065 )),
14: gString( new BassString( 0.045 ))
15: {
16: eString.tune( 'E' );
17: aString.tune( 'A' );
18: dString.tune( 'D' );
19: gString.tune( 'G' );
20: }
Returning to the previous example, line 16 is given ‘inline-close’
syntax, while line 12 is given ‘defun-block-open’ syntax, and lines 13
through 15 are all given ‘statement’ syntax. Line 17 is interesting in
that its syntactic analysis list contains three elements:
((inclass 58) (topmost-intro 380) (friend))
The ‘friend’ and ‘inline-open’ syntactic symbols are modifiers that
do not have anchor positions.
Template definitions introduce yet another syntactic symbol:
1: ThingManager <int,
2: Framework::Callback *,
3: Mutex> framework_callbacks;
Here, line 1 is analyzed as a ‘topmost-intro’, but lines 2 and 3 are
both analyzed as ‘template-args-cont’ lines.
---------- Footnotes ----------
(1) This is the case even for C and Objective-C. For consistency,
structs in all supported languages are syntactically equivalent to
classes. Note however that the keyword ‘class’ is meaningless in C and
Objective-C.