2011-12-21 2 views
1

Обзор:равнину с использованием нового ключевого слова

Я работаю с приложением хобби. Я хочу, чтобы моя программа была в состоянии придерживаться «простой C».

По ряду причин мне приходится использовать компилятор C++ и соответствующую программу для программирования, поддерживающую «Plain C». И по тем же причинам я не могу перейти на компилятор antoher.

И есть некоторые возможности C++, которые я был закодирован, непреднамеренно.

Например, я не использую пространства имен или классы. Мое текущее задание на программирование не является «простым c» или «C++», и я не использовал их некоторое время, поэтому, возможно, я забыл, какой материал является «простым c».

Я просматривал в Интернете, для примеров «Plain C». Я обнаружил, что многие другие разработчики также опубликовали смешанные «простые c» & «C++» примеры (некоторые из них непреднамеренно).

Я использую некоторые динамически распределенные структуры. Я использую «malloc», но вместо этого я скорее использую «новый». Я думал, что некоторые новые версии компилятора & «plain c» разрешили «новый», но, кажется, я ошибаюсь.

Кажется, что «новое» является функцией «C++», &, если я действительно хочу сделать только «простой c», я должен использовать «malloc».

Причина, по которой я хочу придерживаться «простой C», это потому, что я работаю в кросс-платформенной библиотеке/инструменте для не-gui.

Моя текущая платформа "Windowze", мое развитие окружающих средах, являются:

(1) CodeBlocks (MinGW)

(2) Кровопролитие DevCPP

(3) Borland CBuilder 6

Хотя, моя цель - перенести его в Linux и, возможно, на другую платформу s и другие (коммандные) компиляторы.

Быстрый не Испытано Пример:

#include <stdio.h> 
#include <stdlib.h> 
#include <strings.h> 

struct MyData_T 
{ 
    int MyInt; 
    char MyName[512]; 
    char *MyCharPtr; 
}; 

typedef 
    struct MyData_T *MyData_P; 

MyData_P newData(char* AName) 
{ 
    MyData_P Result = null; 

    Result = malloc(sizeof(MyData_T)); 

    strcpy(Result->MyName, AName, strlen(AName)); 
    // do other stuff with fields 

    return Result; 
} // MyData_P newData(...) 

int main(...) 
{ 
    int ErrorCode = 0; 

    MyData_P MyDataVar = newData("John Doe"); 

    // do more stuff with "MyDataVar"; 

    free(MyDataVar); 

    return ErrorCode; 
} // int main(...) 

Вопросы

  1. Где я могу получить рабочий "простой с только" компилятор для x86 (windowze, Linux)?

  2. Должен ли я использовать «malloc», «calloc» и тому подобное?

  3. Должен ли я перейти на «C++» & «новый», а?

  4. Действительно ли «новый» & «удалить» в приложении «plain c»?

  5. Любое другое предложение?

Спасибо.

Отказ Примечание: Я уже потратил несколько часов, пытаясь не размещать один и тот же вопрос, в Stackoverflow, но, ни один из предыдущих ответов не кажется ясным мне.

+4

C++ - * много * больше, чем просто 'new'. Если вы просто хотите написать C, я бы использовал компилятор C, а не компилятор C++. Если вы хотите компилятор C для окон, я бы посмотрел на MinGW – Flexo

+0

. Большинство компиляторов C++ имеют флаг командной строки, в котором говорится, что источник должен интерпретироваться как C, а не C++, и, вероятно, у многих есть флаги, говорящие, как строго это следует применять , Я знаю, что существуют компиляторы ARE C/C++, которые строго соблюдают стандарт C, когда они установлены в надлежащий режим. Вам просто нужно найти его и найти нужный режим. –

+0

Большинство компиляторов C++ имеют возможность компилировать как «plain C». Visual Studio и GCC, по крайней мере, я бы предположил, что другие тоже. Переименуйте файл в '.c', и большинство будет автоматически компилироваться как« plain C ». –

ответ

4

Помните, что C и C++ - фактически совершенно разные языки. Они имеют общий синтаксис, но C - процедурный язык, а C++ - объектно-ориентированный, поэтому они представляют собой различные парадигмы программирования.

gcc должен отлично работать как компилятор C. Я считаю, что MinGW использует его. Он также имеет флаги, которые вы можете указать, чтобы убедиться, что он использует правильную версию C (например, C99).

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

Я бы посоветовал вам просто придерживаться языка, с которым вам удобнее. Тот факт, что вы используете new, предполагает, что это будет C++, но это зависит от вас.

0

Самый важный совет - сохранить файл с расширением .c и отключить расширения компилятора. На Visual C++ и gcc (и, таким образом, MinGW) это заставляет их перейти в режим C, где дополнения C++ будут отключены.

Вы также можете силы режим C помощью -std=c90 (или c99, в зависимости от стандарта C вы хотите использовать, они также отключить расширения GNU) в gcc, /Tc в VC++ (и здесь, чтобы отключить расширения MS вы должны используйте /Za).

0

При использовании Visual Studio, просто сделать файл .c (хотя его не строго C компилятор, он притворяется, и для большинства, достаточно хорошо)

* Никс мир, который вы можете использовать GCC, как его в значительной степени стандарт.

Если вы хотите сделать C придерживаться C, если вы хотите сделать C++, C++ использовать

так придерживайтесь таНос и т.д .... в C++ вы бы использовать смарт-указатели.

4
  1. Вы можете использовать, например. GCC как компилятор C. Чтобы обеспечить его компиляцию как C, используйте параметр -x c. Вы также можете указать конкретную версию стандарта C, например. -std=c99. Чтобы убедиться, что вы не используете расширения GCC, вы можете использовать флаг -pedantic. Я уверен, что другие компиляторы имеют схожие варианты.

  2. malloc и calloc действительно, как вы выделяете память в С.

  3. Это до вас. * Вы говорите, что хотите быть кросс-платформенным, но C++ по существу является «кросс-платформенным» как C. Однако, если вы работаете на встроенных платформах (например, микроконтроллерах или DSP), вы не можете найти C++ компиляторы для них.

  4. Нет, new и delete не поддерживаются в С.


* На мой взгляд, хотя, вы должны сильно рассмотреть вопрос о переходе на C++ для любого применения нетривиальной сложности. C++ имеет гораздо более мощные конструкции высокого уровня, чем C (например, интеллектуальные указатели, контейнеры, шаблоны), которые упрощают много утомительной работы на C. Требуется некоторое время, чтобы научиться эффективно их использовать, но в конечном итоге они будет стоить того.

0

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

+1

Хотя верно, я не уверен, что он обращается к актуальным вопросам :) –

1
  • GCC имеет компилятор C. Это основной. Вы можете позвонить ему с gcc -std=c90, чтобы убедиться, что он не скользит в каких-либо расширениях Gnu или C++.
  • Да, malloc/calloc портативны и безопасны для использования в C
  • Только если у вас есть какая-то причина, чтобы переключиться на C++ ... C является немного более портативным, но не намного, в эти дни.
Смежные вопросы