Код действителен как для C, так и для C ++, но дает другой результат
Есть некоторые синтаксические структуры, которые действительны как для C, так и для C ++, но различаются по поведению при компиляции и запуске на обоих языках.
Некоторые различия также могут быть использованы для создания кода, который компилируется на обоих языках, но ведет себя по-разному. Например, следующая функция вернет разные значения в C и C ++:
Примеры кодов действительны как для C, так и для C ++, но при компиляции дают разные ответы:
// C code that is valid in both // C and C++ but produce different // behavior when compiled. #include <stdio.h> // extern keyword for variable // declaration without define extern int S; // function for struct int differCAndCpp( void ) { // create a structure struct S { int a; int b; }; // return sizeof integer variable return sizeof (S); } // Main driver int main() { // call function differCAndCpp() printf ( "%d" , differCAndCpp()); return 0; } |
Выход:
4
Код на C ++
// C++ code that is valid in both // C and C++ but produce different // behavior when compiled. #include <iostream> using namespace std; // extern keyword used for variable // declaration without define extern int S; // function for struct int differCAndCpp( void ) { // create a structure struct S { int a; int b; }; // return sizeof structure // in c++ return sizeof (S); } // Main driver int main() { // call function differCAndCpp() printf ( "%d" , differCAndCpp()); return 0; } |
Выход:
8
Мы видим, что оба кода одинаковые, но выходы разные. Это связано с тем, что C требует структуры перед тегами структуры (и поэтому sizeof (S) относится к переменной), но C ++ позволяет ее опускать (и поэтому sizeof (S) относится к неявному typedef).
Обратите внимание, что результат отличается, когда объявление extern помещается внутри функции: тогда присутствие идентификатора с тем же именем в области действия функции запрещает неявному typedef вступить в силу для C ++, и результатом для C и C ++ будет тем же. Также обратите внимание, что неоднозначность в приведенном выше примере связана с использованием круглых скобок с оператором sizeof.
При использовании sizeof T ожидается, что T будет выражением, а не типом, и, следовательно, пример не даст такого же результата с C ++.
Связанная статья:
- Разница между Struct в C и C ++
- Напишите программу, которая дает разные результаты на C и C ++
Ссылка: -https: //en.wikipedia.org/wiki/Compatibility_of_C_and_C%2B%2B