Код действителен как для C, так и для C ++, но дает другой результат

Опубликовано: 4 Декабря, 2021

Есть некоторые синтаксические структуры, которые действительны как для 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

Хотите узнать о лучших видео и практических задачах, ознакомьтесь с базовым курсом C ++ для базового и продвинутого уровня C ++ и курсом C ++ STL для базового уровня плюс STL. Чтобы завершить подготовку от изучения языка к DS Algo и многому другому, см. Полный курс подготовки к собеседованию .