Breaking Changes in C 11
C 11 introduced significant changes that may impact the compilation of existing code, including the following:
Core Language
- The introduction of explicit operator bool() in the standard library, replacing instances of operator void*(). This change may cause code that previously relied on implicit conversions to fail to compile.
- New keywords, including alignas, alignof, char16_t, constexpr, and nullptr, may conflict with existing identifiers in code that did not follow naming conventions.
- The behavior of integer division has changed, as C 11 always rounds the result towards 0, while C 03 allowed for rounding towards 0 or negative infinity.
- Implicitly-declared special member functions, such as constructors or destructors, are now defined as deleted if their implicit definition would have been ill-formed, which may cause code using these functions in certain contexts to become invalid.
- User-declared destructors have an implicit exception specification, meaning they cannot throw exceptions. Code that relies on destructors throwing exceptions may need to be modified.
- Dependent calls of functions with internal linkage are now allowed, which may change the resolution of overloaded functions in templates.
Library Changes
- Identifiers added to the C standard library in C 11 may conflict with existing identifiers in code that used headers with the same names.
- The swap function has been moved from the header to the header. Code that includes may need to be updated to include instead.
- The global namespace posix is now reserved for standardization. Code that defines identifiers in this namespace may need to be modified.
- Macros named override, final, carries_dependency, or noreturn are invalid in C 11. Code that defines these macros may need to be updated.
The above is the detailed content of What Breaking Changes Should I Be Aware Of When Migrating Code to C 11?. For more information, please follow other related articles on the PHP Chinese website!