Alias:
SET-SOURCE-PROPERTIES
This statement can be used to define the properties of a source program and to control the behavior of the preprocessor and the C and C++ frontends.
MODIFY-SOURCE-PROPERTIES | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Options to select the language mode
LANGUAGE =
This option specifies in which programming language (C or C++) the sources to be compiled were written.
The default setting of the compiler is LANGUAGE=*CPLUSPLUS(MODE=*LATEST, STRICT=*NO).
LANGUAGE = *C(...)
The source program is a C program.
MODE = *UNCHANGED / *LATEST / *1990 / *2011 / *KERNIGHAN-RITCHIE
The operand MODE determines the language mode:
*UNCHANGED:
The value specified in the last MODIFY-SOURCE-PROPERTIES statement with LANGUAGE=*C applies.
*LATEST:
This is a short cut for latest supported standard. It is the default setting. It is currently mapped to *2011. This mapping might change in a future compiler version.
*1990:
C89 mode
The compiler supports C code, as defined in the ANSI-/ISO-C standard from 1990. The same standard is also known as ANSI C89.
This value corresponds to the specification *ANSI resp. *STRICT-ANSI of the C/C++ V3 compiler.
__STDC_VERSION__
has the value 199409L.
*2011:
C11 mode
The compiler supports C code, as defined in the C-standard of 2011.__STDC_VERSION__
has the value 201112L.
*KERNIGHAN-RITCHIE:
K&R-C-mode
The compiler accepts C code, as defined by Kernighan&Ritchie in the reference manual ("The C Programming Language", First Edition). It also supports C language elements of the ANSI C standard that are semantically identical to the Kernighan&Ritchie "definition" of the C language (e.g. function prototypes, const
, volatile
). This simplifies the conversion of a K&R C source to ANSI C. All C library functions of the CRTE (i.e. ANSI functions, POSIX and X/OPEN functions, UNIX extensions) are available for use.
As far as the preprocessor behavior is concerned, ANSI/ISO C is the default. If desired, the option PREPROCESSING-MODE=*KR can be specified to convert the preprocessor behavior to K&R C (as required when porting old C sources from a UNIX system, for example).
__STDC_VERSION__
is not defined. The operand STRICT has no effect, i.e. STRICT=*NO always applies.
STRICT = *UNCHANGED / *NO / *YES
*NO:
Some required diagnostics are omitted, the name space is not restricted to names that are specified by the standard and some extensions are included. __STDC__
has the value 0, _STRICT_STDC
is not defined.
*YES:
The namespace is restricted to the names defined in the standard, and only the C library functions defined in the ANSI/ISO standard are available. Certain extensions (such as the asm keyword) and some commonly expected header file declarations are not available
Deviations from the standard result in compiler messages (mostly warnings). If desired, the output of errors can be forced in such cases by specifying the option ANSI-VIOLATIONS=*ERROR (see "MODIFY-DIAGNOSTIC-PROPERTIES").
__STDC__
has the value 1, _STRICT_STDC
is defined.
LANGUAGE = *CPLUSPLUS(...)
The source program is a C++ program. This is also the default setting of the compiler before the programming language is defined for the first time with the LANGUAGE option.
MODE = *UNCHANGED / *LATEST / *2017 / *2020 / *V2-COMPATIBLE / *V3-COMPATIBLE
The operand MODE determines the language mode:
*UNCHANGED:
The value specified in the last MODIFY-SOURCE-PROPERTIES statement with LANGUAGE=*CPLUSPLUS applies.
*LATEST:
This is a short cut for latest supported standard. It is the default setting. It is currently mapped to *2020. This mapping might change in a future compiler version.
*2017:
C++ 2017 mode
The compiler supports C++ code, as defined in the C++-standard of 2017.__cplusplus
has the value 201703L and __STDC_VERSION__
the value 199409L.
*2020:
C++ 2020 mode
The compiler supports C++ code, as defined in the C++-standard of 2020. Full C++ 2020 library support is currently not available and instead the existing C++ 2017 library is used.__cplusplus
has the value 202002L and __STDC_VERSION__
the value 199409L.
*V2-COMPATIBLE:
Cfront-C++ mode
The compiler supports the C++ language elements of Cfront V3.0.3. Cfront V3.0.3 was first released with the C++ compiler V2.1.
The Cfront compatible C++ library with complex math and stream-oriented I/O is available.
More information on the Cfront C++ library can be found in the section “The Cfront C++library”.
C++ sources must be compiled with MODE=*V2-COMPATIBLE if their modules are to be linkable with C++ V2.1/V2.2 modules.
This value corresponds to the specification *CPP of the C/C++ V3 compiler.
__cplusplus
has the value 1 and __STDC_VERSION__
the value 199409L. The operand STRICT has no effect, i.e. STRICT=*NO always applies.
*V3-COMPATIBLE:
C++ V3 mode
The compiler supports C++ code like the C/C++ compiler version 3.2.
This value corresponds to the specification *ANSI resp. *STRICT-ANSI of the C/C++ V3 compiler.
__cplusplus
has the value 2 (if STRICT=*NO) resp. 199612L (if STRICT=*YES) and __STDC_VERSION__
has the value 199409L.
STRICT = *UNCHANGED / *NO / *YES
*NO:
Some required diagnostics are omitted, the name space is not restricted to names that are specified by the standard and some extensions are included. __STDC__
has the value 0, _STRICT_STDC
is not defined.
*YES:
The namespace is restricted to the names defined in the standard, and only the C library functions defined in the ANSI/ISO standard are available. Certain extensions (such as the asm keyword) and some commonly expected header file declarations (stdio.h, stdlib.h etc.) are not available.
Deviations from the standard result in compiler messages (mostly warnings). If desired, the output of errors can be forced in such cases by specifying the option ANSI-VIOLATIONS=*ERROR (see "MODIFY-DIAGNOSTIC-PROPERTIES").
__STDC__
has the value 1, _STRICT_STDC
is defined.
Preprocessor options
DEFINE = *NONE
Only the names and values that are specified by #define
directives in the program or are predefined by the compiler are considered valid for the current compiler run.
DEFINE = *UNCHANGED
The values specified in the last MODIFY-SOURCE-PROPERTIES statement apply.
DEFINE = <c-string 1..125 with-low> / <name 1..125 with-under>
<c-string> / <name> is used to define a name. This definition has the same effect as the following statement in a program:
#define
name 1
Such names are queried in the program with, for example, the preprocessor directives #ifdef
, #ifndef
or #if defined()
, #if ! defined()
. See also the example below. When POSIX library functions are used, the _OSD_POSIX directive must be set before the occurrence of the first #include
directive in the program. The easiest way to do this is by means of a definition at the time of compilation.
DEFINE = *SUBSTITUTE(...)
This substructure is used to define macros and symbolic constants (analogous to a #define
directive for replacing text). See also the example below.
IDENTIFIER = <c-string 1..125 with-low> / <name 1..125 with-under>
<c-string> / <name> designates the name to be replaced in the source program by the value or text specified with TOKEN-STRING.
TOKEN-STRING = <c-string 1..125 with-low> / <name 1..125 with-under>
<c-string> / <name> specifies the value or text to be substituted in the source program for the name indicated by IDENTIFIER.
Note
If data in the DEFINE option is inconsistent with any #define
directives in the source program, the entries in the source program will always be given precedence!
Example: DEFINE option
MODIFY-SOURCE-PROP DEFINE=('mch_file',DEBUG,_OSD_POSIX,*SUB('host',BS2000),*SUB(LAN,'C++'))
Values set with DEFINE must be enclosed in single quotes if they contain characters other than uppercase A to Z, the digits 0 to 9, or the special characters $, #, @, and _ (see also the table on "SDF notational conventions (C/C++-Compiler, #8)").
The above entries in the DEFINE option correspond to the following #define
directives in the source program:
#define mch_file 1 #define DEBUG 1 #define _OSD_POSIX 1 #define host BS2000 #define LAN C++
UNDEFINE = *NONE
The DEFINE entries (see above) remain unmodified by default.
UNDEFINE = *UNCHANGED
The values specified in the last MODIFY-SOURCE-PROPERTIES statement apply.
UNDEFINE = *ALL
All DEFINE entries are deleted.
UNDEFINE = <c-string 1..125 with-low> / <name 1..125 with-under>
The names specified with DEFINE <c-string> / <name> are deleted.
ASSERT = *NONE / *UNCHANGED / list-poss: *SUBSTITUTE(...)
This option can be used to define an assertion, as if by a preprocessor #assert
directive (see "Extensions to ANSI/ISO C ").
ASSERT= *SUBSTITUTE(...)
IDENTIFIER = <c-string 1..125 with-low> / <name 1..125 with-under>
<c-string> / <name> designates the name of the assertion.
TOKEN-STRING = <c-string 1..125 with-low> / <name 1..125 with-under>
<c-string> / <name> specifies the value or text to be substituted for the assertion designated by IDENTIFIER.
PREINCLUDE = *UNCHANGED / *NONE / <c-string 1..1024 with-low>
The pre-include option specifies an include file which is to be included at the start of the source program via an imaginary #include statement. The preprocessor searches for this include file in the USER-INCLUDE paths.
The include file specified via the PREINCLUDE option will be handled like an include file which is specified inside an #include statement at the beginning of the source program.
If several include files are to be pre-included then the corresponding #include statements should be collected together in a single include file and this include file should then be specified via the PREINCLUDE option.
COMMENTS = *UNCHANGED / *YES / *NO
This option can be used to specify whether the expanded and recompilable source program created by the preprocessor may also contain comments.
PREPROCESSING-MODE = *UNCHANGED / *ANSI / *KR
*UNCHANGED
The values specified in the last MODIFY-SOURCE-PROPERTIES statement apply.
*ANSI
This is the default setting in all C and C++ language modes of the compiler. Inother words, preprocessor behavior in accordance with the ANSI/ISO C standard is also supported in the K&R C mode by default.
*KR
The obsolete preprocessor behavior based on Reiser ́s cpp and Johnson ́s pcc can be turned on with *KR.
IMPLICIT-INCLUDE = *UNCHANGED / *YES / *NO
This option only affects C++ templates. It determines whether or not the definition of a template is included implicitly (see the section “Implicit inclusion”).
Common frontend options in C and C++
SIGNED-CHARACTER = *UNCHANGED / *YES / *NO
*UNCHANGED
The values specified in the last MODIFY-SOURCE-PROPERTIES statement apply.
*NO: The data type char
is unsigned
by default.
*YES: char
is treated as a signed char
in expressions and conversions.Note that the use of this option may result in portability problems!
AT-ALLOWED = *UNCHANGED / *YES / *NO
Determines whether the "at" sign ’@
’ is allowed (*YES) or not allowed (*NO) in names.
The Cfront-C++ library contains declarations with the “at” sign (@) (see "The standard C++ library (C/C++-Compiler, #120)").
DOLLAR-ALLOWED = *UNCHANGED / *YES / *NO
Determines whether the "dollar" sign ’$
’ is allowed (*YES) or not allowed (*NO) in names.
ENUM-TYPE = *UNCHANGED / *VALUE-DEPENDENT / *LONG
This option controls the handling of enum
data.
*UNCHANGED
The values specified in the last MODIFY-SOURCE-PROPERTIES statement apply.
*VALUE-DEPENDENT: depending on the range of values, enum
data is represented as char
, short
, or long
.
*LONG: enum
data is always treated as objects of type long
.
SIGNED-FIELDS = *UNCHANGED / *SIGNED / *UNSIGNED
*UNCHANGED
The values specified in the last MODIFY-SOURCE-PROPERTIES statement apply.
*SIGNED: By default, signed
bit fields are treated as signed
.
*UNSIGNED: signed
bit fields are always interpreted as unsigned
. This option is only offered for compatibility reasons with older C versions and is only meaningful in K&R C mode.
PLAIN-FIELDS = *UNCHANGED / *SIGNED / *UNSIGNED
This option controls whether integer bit fields (short
, int
, long
) are treated as signed
(*SIGNED) or unsigned
(*UNSIGNED) types. signed
is the default.
PRESERVING = *UNCHANGED / *UNSIGNED / *LONG
This option controls whether arithmetic operations with operands of type long
and unsigned int
return a result of type long
(*LONG) in accordance with K&R mode (first edition; see section 6.6 in the appendix) or of type unsigned long
(*UNSIGNED) in accordance with ANSI/ISO C.
ALTERNATIVE-TOKENS = *UNCHANGED / *YES / *NO
This option controls whether alternative tokens are to be recognized by the compiler.This includes:
digraph sequences (e.g.
<:
for[
) in the C and C++ modes andadditional keywords for operators (e.g.
and
for&&
,bitand
for&
), which are only valid in the C++ language mode.
*YES is the default for the modes C11, C++ V3, C++ 2017 and C++2020.
*NO is the default for all other modes.
EXTERNAL-DEFINITION =
This option controls how the compiler reserves memory for the externally visible variables of a module. This is important if the program consists of several modules that are to be subsequently linked into an object program.
EXTERNAL-DEFINITION = *UNCHANGED
The values specified in the last MODIFY-SOURCE-PROPERTIES statement apply.
EXTERNAL-DEFINITION = *BY-SOURCE-LANGUAGE
The value of the EXTERNAL-DEFINITION option depends on the information in the language mode options:
LANGUAGE=*C(MODE=*KERNIGHAN-RITCHIE): MULTIPLY-ALLOWED LANGUAGE=*C(MODE=*1990/*2011): UNIQUE LANGUAGE=*CPLUSPLUS(): UNIQUE
EXTERNAL-DEFINITION = *UNIQUE
Externally visible variables may be defined in precisely one module only and must be declared in all other modules as extern
. The memory space for such variables is set up in the data module of the object in which the variable has been defined. If the variable is defined in more than one module, an appropriate error message will be issued at the time of linking.
EXTERNAL-DEFINITION = *MULTIPLY-ALLOWED
This option is used for programs in which an externally visible variable is defined in more than one module, but is to be assigned to precisely one memory area. To achieve this, the variable must not be statically initialized in any definition. The compiler sets aside the memory for this variable in the COMMON area so that later, after linkage, only one memory area is assigned to the multiply defined variable.
If the variable is initialized statically in the definition, the memory area is created not in the COMMON area but in the data area. Assignment to precisely one memory area is then not possible!
This specification is not allowed in the C++ language modes.
LONGLONG = *UNCHANGED / *YES / *NO
This option determines whether the data type long long
is recognized by the compiler.
*UNCHANGED
The values specified in the last MODIFY-SOURCE-PROPERTIES statement apply.
*YES
By default, the data type long long
is recognized and the preprocessor define _LONGLONG
is set.
*NO
The use of the data type long long
results in an error. This setting is only allowed in strict C89 mode and strict C++ V3 mode.
END-OF-LINE-COMMENTS = *UNCHANGED / *YES / *NO
This option determines whether the compiler accepts C++ comments (//...) in C programs as well. C++ comments can only be allowed in the extended C89 mode (MODE=*1990, STRICT=*NO). They are not allowed in the other C modes (strict C89 and K&R) and are always valid in the C++ modes and in C11 mode.
*UNCHANGED
The values specified in the last MODIFY-SOURCE-PROPERTIES statement apply.
*YES
The compiler accepts C++ comments in extended C89 mode.
*NO
The compiler does not accepts C++ comments in extended C89 mode (default setting).
LITERAL-ENCODING = *UNCHANGED / *NATIVE / *ASCII / *ASCII-FULL / *EBCDIC / *EBCDIC-FULL
This option determines whether the C/C++ compiler object code for EBCDIC characters and EBCDIC literal strings creates characters and literal strings in EBCDIC or ASCII format (ISO 8859-1).
In C/C++, literal strings can contain binary coded characters as octal or hexadecimal escape sequences with the following syntax:
octal escape sequences:
\[0-7] [0-7] [0-7]
hexadecimal escape sequences:
\x[0-9A-F] [0-9A-F]
Whether or not the C/C++ compiler escape sequences are converted into ASCII format depends on the value specified for the option LITERAL-ENCODING = ... .
LITERAL-ENCODING = *UNCHANGED
The settings of the last MODIFY-SOURCE-PROPERTIES statement apply.
LITERAL-ENCODING = *NATIVE
The C/C++ compiler leaves the character and literal string code in the EBCDIC format, i.e. it transfers the characters and strings into the object code without converting them.
*NATIVE is the default setting.
LITERAL-ENCODING =*ASCII
The C/C++ compiler encodes the characters and literal strings in ASCII format. Escape sequences will not be converted into ASCII format.
LITERAL-ENCODING =*ASCII-FULL
The C/C++ compiler encodes the characters and literal strings in ASCII format. Escape sequences will be converted into ASCII format.
LITERAL-ENCODING =*EBCDIC
The C/C++ compiler leaves the character and literal string code in the EBCDIC format, i.e. it transfers the characters and strings into the object code without converting them.
LITERAL-ENCODING=*EBCDIC has the same effect as LITERAL-ENCODING=*EBCDIC-FULL or LITERAL-ENCODING=*NATIVE
LITERAL-ENCODING =*EBCDIC-FULL
The C/C++ compiler leaves the character and literal string code in the EBCDIC format, it transfers the characters and strings into the object code without converting them.
LITERAL-ENCODING=*EBCDIC-FULL has the same effect as LITERAL-ENCODING=*EBCDIC or LITERAL-ENCODING=*NATIVE
Requirements:
If your are using ASCII notation for characters and literal strings, you must not declare C library functions explicitly in your source program. C library functions should be declared indirectly by including the corresponding CRTE headers. Otherwise the compilation error ‘CFE1079[ERROR]..: Typangabe erwartet / expected a type specifier‘ can occur.
If you select the ASCII or ASCII_FULL options, you should note the following. For each and every CRTE function (C library function) in your program that works with characters or strings, you must use the corresponding or matching include file. If you do not do this, the CRTE functions will not be able to process the character strings correctly. You should ensure that you include the include file <stdio.h> for the function printf() with
<stdio.h>
.In the CRTE runtime environment, some C library functions work with ASCII character strings.
If you are using ASCII character strings, you should specify the
MODIFY-SOURCE-PROPERTIES statement as follows:MODIFY-SOURCE-PROPERTIES - ... LITERAL-ENCODING=ASCII[-FULL] - ...
You must also specify the MODIFY-MODULE-PROPERTIES statement with the following entries:
MODIFY-MODULE-PROPERTIES - ... LOWER-CASE-NAMES=*YES, - SPECIAL-CHARACTERS=*KEEP, - ...
Caution:
C++ library functions do not support ASCII format and must therefore possibly be replaced by C functions.
C++ specific frontend options
INSTANTIATION = *UNCHANGED / *NONE / *AUTO / *LOCAL / *ALL
This option is only relevant in the language modes C++ V3, C++ 2017 and C++ 2020. It controls how templates with external linkage are instantiated. This includes function templates as well as (non-static and non-inline) functions and static variables that are members of template classes. These templates types are combined under the generic term "template entity" below.
All instantiations requested explicitly with the instantiation directive template
declaration or with the instantiation pragma #pragma instantiate
template-entity are always created by the compiler for each compilation unit in all instantiation modes.
The remaining template entities are instantiated as follows:
*NONE
No instantiations other than those requested explicitly are created.
*AUTO (default setting):
Instantiation is performed across all compilation units by means of a prelinker. This prelinker is activated with the BIND statement (see "BIND (C/C++-Compiler, #36)"). The principle of automatic instantiation is discussed in detail in the section “Automatic instantiation”.
*LOCAL:
Instantiations are created per compilation unit, i.e. all template entities that are used in a compilation unit are instantiated. The generated functions are given internal linkage. This mode provides a very simple mechanism for getting started with template programming. The compiler will instantiate the functions that are used in each compilation unit as local functions, and the program will link and run correctly. This method does, however, result in multiple copies of instantiated functions and is therefore not suitable for production use. Note that there may also be problems due to multiple copies of local static variables. For the same reasons, this method is also not suitable if one of the templates contains a static
variable.
Warning:
The basic_string
template contains a static
variable in order to represent an empty string. If you use the *LOCAL
option and the type string
from the library, this empty string is no longer recognized. Try to avoid using this combination as it can lead to serious problems.
*ALL:
Instantiations are created per compilation unit, i.e. all template entities that are declared or referenced in a compilation unit are instantiated. All member functions and static variables of a template class are instantiated, regardless of whether or not they are used.
Template functions are instantiated even if they have only been declared.
USE-STD-NAMESPACE = *UNCHANGED / *YES / *NO
This option determines the use of C++ library functions for which names have been defined in the standard std
namespace.
*YES is the default setting in extended C++ V3 mode. The compiler behaves as if the following lines were entered at the start of a compilation unit:
namespace std{}
using namespace std;
*NO is the default setting in strict C++ V3 mode, in mode C++ 2017 and in mode C++ 2020 and the only possible behavior in Cfront C++ mode.
If USE-STD-NAMESPACE=*NO is set in the mode C++ V3, C++ 2017 or C++ 2020, the source program must contain the statement using namespace std;
otherwise, the names must be qualified appropriately before the first call to a C++ library function.
KEYWORD-BOOL = *UNCHANGED / *YES / *NO
This option can be used to define whether bool
is recognized as a keyword.
*YES is the default behavior in mode C++ V3 and the only allowed behavior in mode C++ 2017 and C++ 2020. In this case, the preprocessor macro _BOOL
is defined.
*NO is the default setting and the only possible behavior in the Cfront C++ mode.
KEYWORD-WCHAR = *UNCHANGED / *YES / *NO
This option can be used to define whether wchar_t
is recognized as a keyword.
*YES is the default behavior in mode C++ V3 and the only allowed behavior in mode C++ 2017 and C++ 2020. In this case, the preprocessor macro _WCHAR_T
is defined.
*NO is the default setting and the only possible behavior in the Cfront C++ mode.
LOOP-INIT = *UNCHANGED / *OLD / *NEW
This option defines how an initialization statement in for
and while
loops is to be treated.
*OLD is the default behavior in the Cfront-C++ mode and specifies that an initialization statement has the same scope as the entire loop.
*NEW is the default behavior in mode C++ V3 and the only allowed behavior in mode C++ 2017 and C++ 2020. It specifies the new ANSI C++-conformant scope rule, which surrounds the entire loop in its own implicitly generated scope.
SPECIALIZATION = *UNCHANGED / *OLD / *NEW
This option is only relevant in the modes C++ V3, C++ 2017 and C++ 2020. It is used to specify whether template specializations need the new syntax template<>
.
*NEW is the default behavior in mode C++ V3 and the only allowed behavior in mode C++ 2017 and C++ 2020. In this case, the compiler does not define the macro __OLD_SPECIALIZATION_SYNTAX.
If *OLD is specified, the compiler implicitly defines the macro __OLD_SPECIALIZATION_SYNTAX
with the value 1.