使用new关键字的普通c

0wi1tuuw  于 2023-02-03  发布在  其他
关注(0)|答案(7)|浏览(230)
    • 概述:**

我正在使用一个业余爱好应用程序。我希望我的程序能够坚持"纯C"。
由于几个原因,我必须使用C编译器,以及相关的编程环境程序,支持"普通C"。而且,由于同样的原因,我不能改变到另一个编译器。
而且,有一些C
特性是我无意中编写的。
例如,我没有使用命名空间或类,我目前的编程工作不是"plain c"或"c++",我已经有一段时间没有使用它们了,所以,我可能忘记了哪些东西只是"plain c"。
我在网上浏览了一下"普通C"的例子,我发现很多其他的开发人员,也发布了混合的"普通C"和"C++"的例子,(有些是无意的)。
我正在使用一些动态分配的结构。我一直在使用malloc,但是我宁愿用new代替。我以为一些新的标准和编译版本的plain c允许new,但是,看起来我错了。
看起来"new"是一个"c++"特性,&如果我真的想做一个只有"plain c"的,我应该使用"malloc"。
我坚持使用"plain C"的原因,是因为我使用的是一个跨平台的非GUI库/工具。
我目前的平台是"Windowze",我的开发环境是:
(1)* * 代码块(最小GW)**
(2)* * 流血的发展CPP**
(3)* * 博兰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.我在哪里可以得到一个工作的"纯c"编译器的x86(windowze,linux)?
1.我应该坚持使用"malloc"、"calloc"以及类似的语言吗?
1.我应该考虑换成"C++"和"new"吗?
1.在"plain c"应用程序中使用"new"和"delete"是否有效?
1.还有别的建议吗?
谢谢。

    • 免责声明**注意:我已经花了几个小时试图不张贴同样的问题,在Stackoverflow,但是,没有一个以前的答案似乎对我来说很清楚。
bq3bfh9z

bq3bfh9z1#

记住C和C实际上是完全不同的语言,它们共享一些共同的语法,但C是过程语言,而C是面向对象的,所以它们是不同的编程范式。
gcc作为一个C编译器应该工作得很好。我相信MinGW使用它。它也有一些标志,你可以指定来确保它使用的是正确的C版本(例如C99)。
如果你想坚持使用C语言,那么你就不能使用new(它不是C语言的一部分),但是对于一个共享库来说,转移到C应该没有任何问题,只要你戴上面向对象的帽子。
我建议你坚持使用你更熟悉的语言,事实上你使用的是new,这意味着你将使用C
,但这取决于你。

cnjp1d6j

cnjp1d6j2#

1.你可以使用GCC作为C编译器。为了确保它编译成C,使用-x c选项。你也可以指定一个特定版本的C标准,例如-std=c99。为了确保你没有使用任何GCC特定的扩展,你可以使用-pedantic标志。我相信其他编译器也有类似的选项。

  1. malloccalloc确实是C中分配内存的方式。
    1.这取决于您。* 您说您希望跨平台,但C本质上与C一样“跨平台”。然而,如果您在嵌入式平台(如微控制器或DSP)上工作,您可能找不到适用于它们的C编译器。
    1.不支持,C语言中不支持newdelete
  • 不过,在我看来,对于任何复杂性不小的应用程序,你都应该强烈考虑改用C++。C++拥有比C强大得多的高级构造(例如,智能指针、容器、模板),它们简化了C中许多繁琐的工作。学习如何有效地使用它们需要一段时间,但从长远来看,它们是值得的。
ni65a41a

ni65a41a3#

  • GCC有一个C编译器。它是最基本的一个。你可以用gcc -std=c90调用它,以确保它不会在任何Gnu或C++扩展中出错。
  • 是的,malloc/calloc是便携式的,可安全地在C中使用
  • 只有当你有一些理由切换到C++... C是一个有点更便携,但不是很多,这些天。
qncylg1j

qncylg1j4#

最重要的提示是用.c扩展名保存文件并禁用编译器扩展名。在Visual C和gcc(以及MinGW)上,这会使它们进入C模式,在那里C添加将被禁用。
您还可以使用-std=c90(或c99,取决于您要使用的C标准;这些也禁用GNU扩展)在gcc中,/Tc在VC++中(在这里要禁用MS扩展,您必须使用/Za)。

jrcvhitl

jrcvhitl5#

如果使用Visual Studio,只需将文件制作为.c(尽管它不是严格意义上的C编译器,但它假装是,而且在大多数情况下,已经足够好了)

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

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

ocebsuys

ocebsuys6#

你不必坚持用C来创建跨平台的非GUI库。你也可以用C++来开发它。既然这是你的爱好,那也没关系,但是已经有这样的库了。

epfja78i

epfja78i7#

似乎从C17(或技术名称ISO/IEC 9899:2018)开始,new关键字就得到了支持。要实现这一点,如果您使用的是Visual Studio代码,请在c_cpp_properties.json文件更新中:

  • "cStandard": "c17",以及
  • "cppStandard": "c++17"

相关问题