Name n3751, alx-0014r6 - Refactor syntax of preprocessing directives Category Cosmetic refactor; readability; editorial; Authors Alejandro Colomar History r4 (2025-08-29): - Split from alx-0014. r5 (2025-08-31): - Move alx-0014 to a separate proposal: alx-0065. r6 (2025-08-31; n3751): - Merge the split proposals into a single on with subsections. Principles - Keep the language small and simple - Facilitate interoperability - Codify existing practice to address evident deficiencies Rationale Editorial change. This moves text around for better organization and readability. No semantic changes. This makes it so that any future proposals to the preprocessor will be easier to apply. The proposal is split in subsections, separated by '---', for better readability. This proposal applies as is to the C++ latest draft, N5014, only changing section numbers and their titles. This change has prior art in C++, as they've done the same exact thing with their pp-import directive. I guess they haven't done it with the other directives for compatibility with us, so let's help them and do it everywhere. Interaction with other proposals This blocks alx-0003 ("Add directives #def and #enddef") This blocks alx-0013 ("Prohibit non-directives (other than ID directives)"). --- Name alx-0014A - Refactor syntax of include directives Proposed wording Based on C N3550. 6.10.1 Preprocessing directives :: General (C++: 15.1 :: Preamble) @@ Syntax, p1 (C++: no 'Syntax' subtitle) control-line: - # include pp-tokens new-line + include-directive pp-import (C++ only) # embed pp-tokens new-line # define identifier replacement-list new-line # define identifier lparen identifier-list(opt) ) replacement-list new-line # define identifier lparen ... ) replacement-list new-line # define identifier lparen identifier-list , ... ) replacement-list new-line # undef identifier new-line # line pp-tokens new-line # error pp-tokens(opt) new-line # warning pp-tokens(opt) new-line # pragma pp-tokens(opt) new-line # new-line 6.10.3 Source file inclusion (C++: 15.3) ## Add 'Syntax' before 'Constraints' (C++: No subtitles) @@ Syntax, new p after title +include-directive: + # include pp-tokens new-line --- Name alx-0014B - Refactor syntax of embed directives Proposed wording Based on N3550. 6.10.1 Preprocessing directives :: General @@ Syntax, p1 control-line: # include pp-tokens new-line pp-import (C++ only) - # embed pp-tokens new-line + embed-directive # define identifier replacement-list new-line # define identifier lparen identifier-list(opt) ) replacement-list new-line # define identifier lparen ... ) replacement-list new-line # define identifier lparen identifier-list , ... ) replacement-list new-line # undef identifier new-line # line pp-tokens new-line # error pp-tokens(opt) new-line # warning pp-tokens(opt) new-line # pragma pp-tokens(opt) new-line # new-line ... -pp-parameter: - pp-parameter-name pp-parameter-clause(opt) - -pp-parameter-name: - pp-standard-parameter - pp-prefixed-parameter - -pp-standard-parameter: - identifier - -pp-prefixed-parameter - identifier :: identifier - -pp-parameter-clause: - ( pp-balanced-token-sequence(opt) ) - -pp-balanced-token-sequence: - pp-balanced-token - pp-balanced-token-sequence pp-balanced-token - -pp-balanced-token: - ( pp-balanced-token-sequence(opt) ) - [ pp-balanced-token-sequence(opt) ] - { pp-balanced-token-sequence(opt) } - any pp-token other than a parenthesis, a bracket, or a brace - -embed-parameter-sequence: - pp-parameter - embed-parameter-sequence pp-parameter 6.10.4.1 Binary resource inclusion :: #embed preprocessing directive ## Add 'Syntax' before 'Description' @@ Syntax, new p after title +embed-directive: + # embed pp-tokens new-line + +pp-parameter: + pp-parameter-name pp-parameter-clause(opt) + +pp-parameter-name: + pp-standard-parameter + pp-prefixed-parameter + +pp-standard-parameter: + identifier + +pp-prefixed-parameter + identifier :: identifier + +pp-parameter-clause: + ( pp-balanced-token-sequence(opt) ) + +pp-balanced-token-sequence: + pp-balanced-token + pp-balanced-token-sequence pp-balanced-token + +pp-balanced-token: + ( pp-balanced-token-sequence(opt) ) + [ pp-balanced-token-sequence(opt) ] + { pp-balanced-token-sequence(opt) } + any pp-token other than a parenthesis, a bracket, or a brace + +embed-parameter-sequence: + pp-parameter + embed-parameter-sequence pp-parameter --- Name alx-0014C - Refactor syntax of macros Proposed wording Based on N3550. 6.10.1 Preprocessing directives :: General @@ Syntax, p1 control-line: # include pp-tokens new-line # embed pp-tokens new-line - # define identifier replacement-list new-line - # define identifier lparen identifier-list(opt) ) replacement-list new-line - # define identifier lparen ... ) replacement-list new-line - # define identifier lparen identifier-list , ... ) replacement-list new-line + define-directive - # undef identifier new-line + undef-directive # line pp-tokens new-line # error pp-tokens(opt) new-line # warning pp-tokens(opt) new-line # pragma pp-tokens(opt) new-line # new-line ... -lparen: - a ( character not immediately preceded by white space - -replacement-list: - pp-tokens(opt) ... -identifier-list: - identifier - identifier-list , identifier 6.10.5.1 Macro replacement :: General ## Add 'Syntax' before 'Constraints' @@ Syntax, new p after title +define-directive: + # define identifier replacement-list new-line + # define identifier lparen identifier-list(opt) ) replacement-list new-line + # define identifier lparen ... ) replacement-list new-line + # define identifier lparen identifier-list , ... ) replacement-list new-line + +undef-directive: + # undef identifier new-line + +lparen: + a ( character not immediately preceded by white space + +replacement-list: + pp-tokens(opt) + +identifier-list: + identifier + identifier-list , identifier --- Name alx-0014D - Refactor syntax of conditional directives Proposed wording Based on N3550. 6.10.1 Preprocessing directives :: General @@ Syntax, p1 -if-section: - if-group elif-groups(opt) else-group(opt) endif-line - -if-group: - # if constant-expression newline group(opt) - # ifdef identifier new-line group(opt) - # ifndef identifier new-line group(opt) - -elif-groups: - elif-group - elif-groups elif-group - -elif-group: - # elif constant-expression new-line group(opt) - # elifdef identifier new-line group(opt) - # elifndef identifier new-line group(opt) - -else-group: - # else new-line group(opt) - -endif-line: - # endif new-line 6.10.2 Conditional inclusion @@ Syntax, p1 +if-section: + if-group elif-groups(opt) else-group(opt) endif-line + +if-group: + # if constant-expression newline group(opt) + # ifdef identifier new-line group(opt) + # ifndef identifier new-line group(opt) + +elif-groups: + elif-group + elif-groups elif-group + +elif-group: + # elif constant-expression new-line group(opt) + # elifdef identifier new-line group(opt) + # elifndef identifier new-line group(opt) + +else-group: + # else new-line group(opt) + +endif-line: + # endif new-line + ... --- Name alx-0014E - Refactor syntax of line directives Proposed wording Based on N3550. 6.10.1 Preprocessing directives :: General @@ Syntax, p1 control-line: # include pp-tokens new-line # embed pp-tokens new-line # define identifier replacement-list new-line # define identifier lparen identifier-list(opt) ) replacement-list new-line # define identifier lparen ... ) replacement-list new-line # define identifier lparen identifier-list , ... ) replacement-list new-line # undef identifier new-line - # line pp-tokens new-line + line-directive # error pp-tokens(opt) new-line # warning pp-tokens(opt) new-line # pragma pp-tokens(opt) new-line # new-line 6.10.6 Line control ## Add 'Syntax' before 'Constraints' @@ Syntax, new p after title +line-directive: + # line pp-tokens new-line --- Name alx-0014F - Refactor syntax of diagnostic directives Proposed wording Based on N3550. 6.10.1 Preprocessing directives :: General @@ Syntax, p1 control-line: # include pp-tokens new-line # embed pp-tokens new-line # define identifier replacement-list new-line # define identifier lparen identifier-list(opt) ) replacement-list new-line # define identifier lparen ... ) replacement-list new-line # define identifier lparen identifier-list , ... ) replacement-list new-line # undef identifier new-line # line pp-tokens new-line - # error pp-tokens(opt) new-line - # warning pp-tokens(opt) new-line + diagnostic-directive # pragma pp-tokens(opt) new-line # new-line 6.10.7 Diagnostic directives ## Add 'Syntax' before 'Constraints' @@ Syntax, new p after title +diagnostic-directive: + # error pp-tokens(opt) new-line + # warning pp-tokens(opt) new-line --- Name alx-0014G - Refactor syntax of pragma directives Proposed wording Based on N3550. 6.10.1 Preprocessing directives :: General @@ Syntax, p1 control-line: # include pp-tokens new-line # embed pp-tokens new-line # define identifier replacement-list new-line # define identifier lparen identifier-list(opt) ) replacement-list new-line # define identifier lparen ... ) replacement-list new-line # define identifier lparen identifier-list , ... ) replacement-list new-line # undef identifier new-line # line pp-tokens new-line # error pp-tokens(opt) new-line # warning pp-tokens(opt) new-line - # pragma pp-tokens(opt) new-line + pragma-directive # new-line 6.10.8 Pragma directive ## Add 'Syntax' before 'Constraints' @@ Syntax, new p after title +pragma-directive: + # pragma pp-tokens(opt) new-line --- Name alx-0014H - Refactor syntax of null directives Proposed wording Based on N3550. 6.10.1 Preprocessing directives :: General @@ Syntax, p1 control-line: # include pp-tokens new-line # embed pp-tokens new-line # define identifier replacement-list new-line # define identifier lparen identifier-list(opt) ) replacement-list new-line # define identifier lparen ... ) replacement-list new-line # define identifier lparen identifier-list , ... ) replacement-list new-line # undef identifier new-line # line pp-tokens new-line # error pp-tokens(opt) new-line # warning pp-tokens(opt) new-line # pragma pp-tokens(opt) new-line - # new-line + null-directive 6.10.9 Null directive ## Add 'Syntax' before 'Constraints' @@ Syntax, new p after title +null-directive: + # new-line