Affected subclause: [conv.ptr]
Change:
Converting
void* to a pointer-to-object type requires casting
.
char a[10];
void* b=a;
void foo() {
char* c=b;
}
ISO C will accept this usage of pointer to void being assigned
to a pointer to object type
. Rationale:
C++ tries harder than C to enforce compile-time type safety
. Effect on original feature:
Deletion of semantically well-defined feature
. Difficulty of converting:
Could be automated
. Violations will be diagnosed by the C++ translator
. The
fix is to add a cast
. For example:
char* c = (char*) b;
How widely used:
This is fairly widely used but it is good
programming practice to add the cast when assigning pointer-to-void to pointer-to-object
. Some ISO C translators will give a warning
if the cast is not used
. Affected subclause: [expr.call]
Change:
Implicit declaration of functions is not allowed
. Rationale:
The type-safe nature of C++
. Effect on original feature:
Deletion of semantically well-defined feature
. Note: the original feature was labeled as “obsolescent” in ISO C
. Difficulty of converting:
Syntactic transformation
. Facilities for producing explicit function declarations are fairly
widespread commercially
. Affected subclauses: [expr.sizeof] and
[expr.cast]
Change:
Types must be defined in declarations, not in expressions
.
In C, a sizeof expression or cast expression may define a new type
. For example,
p = (void*)(struct x {int i;} *)0;
defines a new type, struct
x. Rationale:
This prohibition helps to clarify the location of
definitions in the source code
. Effect on original feature:
Deletion of semantically well-defined feature
. Difficulty of converting:
Syntactic transformation
. Affected subclauses: [expr.cond],
[expr.ass], and
[expr.comma]
Change:
The result of a conditional expression, an assignment expression, or a comma expression may be an lvalue
. Rationale:
C++ is an object-oriented language, placing relatively
more emphasis on lvalues
. For example, function calls may
yield lvalues
. Effect on original feature:
Change to semantics of well-defined feature
. Some C
expressions that implicitly rely on lvalue-to-rvalue
conversions will yield different results
. For example,
char arr[100];
sizeof(0, arr)
yields
100
in C++ and
sizeof(char*)
in C
. Difficulty of converting:
Programs must add explicit casts to the appropriate rvalue
.