Написать код на C ++ в стиле C - PullRequest
4 голосов
/ 11 ноября 2011

Если мы хотим написать модуль на C и должны скомпилировать его как C ++ с g++, можно ли разрабатывать фрагмент кода на C ++ без каких-либо собственных классов, используя только «глобальные / статические функции», как вC?Так что, проще говоря, написать код C на C ++ (с небольшими изменениями системных заголовков и т. Д.)

Ответы [ 6 ]

7 голосов
/ 11 ноября 2011

Да. На самом деле, это вообще хорошая идея, потому что C ++ обеспечивает более строгую проверку типов, чем C.

4 голосов
/ 11 ноября 2011

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

Допустимо в C, но недопустимо в C ++

  • C ++ имеет новые ключевые слова (класс, шаблон, виртуальные и т. Д.), Вы не должны использовать его в своем коде C, если вы собираетесь его компилировать с помощью компилятора C ++
  • C ++ имеет очень ограниченное приведение типов:

Действителен в C, но недействителен в C ++

int *j = malloc(sizeof(int) * 5);

Допустим в обоих:

int *j = (int *) malloc(sizeof(int) * 5);
  • Константы перечисления (значения перечисления) всегда имеюттип int в C, тогда как в C ++ они являются различными типами и могут иметь размер, отличный от размера int.
  • C позволяет объявлять типы struct, union и enum в прототипах функций, тогда как C ++ этого не делает.

По-разному ведут себя в C и C ++

  • Символьные литералы, такие как 'a', имеют тип int в C и тип char в C ++
  • Статическийключевое слово используется в C, чтобы ограничить функцию или глобальную переменнуюДоступно для файла области (внутренняя связь).Это также допустимо в C ++, хотя C ++ отказывается от такого использования в пользу анонимных пространств имен (которые недоступны в C).Кроме того, C ++ неявно обрабатывает любой const global как область видимости файла, если только он явно не объявлен как extern, в отличие от C, в котором extern является значением по умолчанию.И наоборот, встроенные функции в C имеют файловую область, в то время как они имеют внешнюю связь по умолчанию в C ++.

Вы можете найти полный список различий, здесь

4 голосов
/ 11 ноября 2011

Вам нужно будет сделать несколько вещей, отличных от , использовать только функции , в частности, вы должны пометить все свои функции как extern "C", чтобы избежать искажения имени и обеспечить соблюдение соглашений о вызовах C (и, случайно, заблокировать вас). от перегрузки). Если вы хотите иметь возможность компилировать его в C, вам нужно будет квалифицировать типы с struct при объявлении переменных (enum для перечислений) или предоставить соответствующие typedefs ...

В качестве альтернативы, вы можете добавить -x c к опциям компилятора, чтобы сказать g ++, чтобы компилировать код как C (если вы не можете изменить командную строку с g++ на gcc, вы не сможете добавить флаги компилятора либо ...)

2 голосов
/ 11 ноября 2011

Вы можете «писать на C ++» во многих стилях - это одна из основных сильных сторон языка. Это включает строго процедурный, плоский стиль программирования, общий для программ на Си. Вы по-прежнему будете писать на C ++, но код должен выглядеть очень знакомым любому программисту на C.

Строго говоря, вам придется использовать заголовки C ++ <cstdio> и т. Д., И все ваши функции библиотеки C находятся в пространстве имен std. Возможно, это одна из немногих законных ситуаций, где вы должны использовать using namespace std;! : -)

1 голос
/ 11 ноября 2011

Я не вижу причин для такой вещи, g ++ и gcc - это просто разные интерфейсы для одного и того же компилятора.Таким образом, для всего, что касается эффективности, совместимости байтов и т. Д., Не должно быть проблем с смешиванием .o файлов, созданных обоими.

C и C ++ имеют много тонких различий, которые могут вызвать проблемы, начиная с таких вещей, как:поскольку sizeof 'a' отличается, но sizeof c является тем же самым (если c является char), чтобы bool был типом в одном и макросом в другом, true имеет тип bool в C ++и int в C, C не допускает static объявлений в for ...

И даже если это так, что C и C ++ имеют большое пересечение, если вы ограничиваете себя тем, чтоПринимая во внимание хорошую практику кодирования в обоих сообществах, вы быстро обнаружите, что пересечение почти пусто.Это касается приведений указателей, выделения с помощью malloc или new, составных инициализаторов по сравнению с конструкторами, массивов переменной длины по сравнению с векторными классами ...

Просто не делайте этого.Все, что вам нужно, это создать красивый интерфейс, который подходит для обоих.

0 голосов
/ 12 ноября 2011

Нет, g++ и gcc - это не два разных интерфейса одного и того же компилятора.

Это два разных драйвера для двух разных компиляторов (cc1plus иcc1) совместное использование одного и того же промежуточного и внутреннего кода (в пределах дерева компоновки GCC, внутри gcc/libbackend.a, неправильное значение, так как оно содержит оба промежуточных конца (средний конец является общей частью GCC, общейдля C, C ++, Ada, Fortran, Objective-C, ... и многих целевых машин: это большая часть GCC и работа над общим набором внутренних представлений, в частности Gimple) и back-end (часть GCCпреобразование представлений Gimple в сборку, используя RTL-зависимое от цели внутреннее представление).

Но cc1 и cc1plus имеют различный код переднего плана.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...