plain c使用new关键字

时间:2011-12-21 19:59:59

标签: c

概述:

我正在使用爱好应用。我希望我的程序能够坚持“普通C”。

由于几个原因,我必须使用C ++编译器和相关的编程环境程序,它支持“Plain C”。并且,出于同样的原因,我无法更改为antoher编译器。

而且,有些C ++功能我已经被无意中编码了。

例如,我没有使用名称空间或类。我目前的编程工作,不是“普通c”或“c ++”,而且我有一段时间没有使用过它们,所以,我可能忘记了哪些东西只是“普通c”。

我在互联网上浏览了“普通C”的例子。我发现很多其他的开发者,也发布了混合“普通c”& “c ++”的例子,(其中一些是无意的)。

我正在使用一些动态分配的结构。我一直在使用“malloc”,但我更倾向于使用“new”。我认为有些新标准& “plain c”的编译器版本允许“new”,但是,似乎我错了。

似乎“新”是“C ++”功能,&如果我真的想制作一个“普通c”,我应该使用“malloc”。

我之所以要坚持“普通C”,是因为我在跨平台的非gui库/工具中工作。

我目前的平台是“Windowze”,我的发展环境是:

(1) CodeBlocks(MinGW)

(2) Bloodshed DevCPP

(3) Borland CBuilder 6

虽然,我的目标是将其迁移到Linux,也许还有其他平台和其他(命令行)编译器。

快速未经测试的示例:

#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)的“纯c”编译器?

  2. 我应该坚持使用“malloc”,“calloc”等类似吗?

  3. 我应该考虑改为“C ++”&amp; “新”,而不是?

  4. 使用“new”&amp;是否有效“普通c”申请中的“删除”?

  5. 还有其他建议吗?

  6. 感谢。

    声明 注意:我已经花了几个小时试图在Stackoverflow中发布相同的问题,但是,以前的答案似乎都不清楚。

6 个答案:

答案 0 :(得分:4)

  1. 您可以使用例如GCC作为C编译器。要确保将其编译为C,请使用-x c选项。您还可以指定C标准的特定版本,例如-std=c99。为确保您不使用任何GCC特定的扩展,您可以使用-pedantic标志。我确信其他编译器也有类似的选择。

  2. malloccalloc确实是如何在C中分配内存的。

  3. 这取决于你。 * 你说你想要跨平台,但C ++本质上就像C一样“跨平台”。但是,如果你是在嵌入式平台(例如微控制器或DSP)上工作时,您可能找不到C ++编译器。

  4. 不,C中不支持newdelete

  5. <小时/> *但是,在我看来,你应该强烈考虑为任何非平凡复杂的应用程序切换到C ++。 C ++具有比C更强大的高级构造(例如智能指针,容器,模板),简化了C中的大量繁琐工作。学习如何有效地使用它们需要一段时间,但从长远来看,它们值得的。

答案 1 :(得分:4)

请记住,C和C ++实际上是完全不同的语言。它们共享一些通用语法,但C是一种过程语言,C ++是面向对象的,因此它们是不同的编程范例。

gcc作为C编译器应该可以正常工作。我相信MinGW使用它。它还有可以指定的标志,以确保它使用正确版本的C(例如C99)。

如果您想坚持使用C,那么您将无法使用new(它不是C语言的一部分),但是为共享库迁移到C ++应该没有任何问题,只要你在你做的时候戴上面向对象的帽子。

我建议你坚持使用你更熟悉的语言。您使用new这一事实表明这将是C ++,但这取决于您。

答案 2 :(得分:1)

  • GCC有一个C编译器。这是基本的。您可以使用gcc -std=c90调用它,以确保它不会出现在任何Gnu或C ++扩展中。
  • 是的,malloc / calloc是便携式的,可以安全地在C
  • 中使用
  • 只有当你有某种理由转而使用C ++时...... C有点便携,但现在还不多。

答案 3 :(得分:0)

最重要的提示是使用.c扩展名保存文件并禁用编译器扩展。在Visual C ++和gcc(以及MinGW)上,这使得它们进入C模式,其中C ++的添加将被禁用。

您还可以使用-std=c90(或c99,取决于您要使用的C标准,这些也禁用GNU扩展)强制 C模式{{1 VC ++中的{,gcc(此处禁用MS扩展,您必须使用/Tc)。

答案 4 :(得分:0)

如果使用visual studio,只需创建文件.c(虽然它不是严格意义上的C编译器,它假装是,并且最重要的是,它已经足够了)

* nix world你可以使用gcc,因为它几乎就是标准。

如果你想做C坚持C,如果你想做C ++,请使用C ++

所以坚持使用malloc等....在C ++中你会使用智能指针。

答案 5 :(得分:0)

您不必坚持使用C来创建跨平台的非GUI库。您也可以在C ++中开发它。既然这是业余爱好,那就没关系,但已经有这样的图书馆了。