概述:
我正在使用爱好应用。我希望我的程序能够坚持“普通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(...)
问题
我可以在哪里获得x86(windowze,linux)的“纯c”编译器?
我应该坚持使用“malloc”,“calloc”等类似吗?
我应该考虑改为“C ++”&amp; “新”,而不是?
使用“new”&amp;是否有效“普通c”申请中的“删除”?
还有其他建议吗?
感谢。
声明 注意:我已经花了几个小时试图在Stackoverflow中发布相同的问题,但是,以前的答案似乎都不清楚。
答案 0 :(得分:4)
您可以使用例如GCC作为C编译器。要确保将其编译为C,请使用-x c
选项。您还可以指定C标准的特定版本,例如-std=c99
。为确保您不使用任何GCC特定的扩展,您可以使用-pedantic
标志。我确信其他编译器也有类似的选择。
malloc
和calloc
确实是如何在C中分配内存的。
这取决于你。 * 你说你想要跨平台,但C ++本质上就像C一样“跨平台”。但是,如果你是在嵌入式平台(例如微控制器或DSP)上工作时,您可能找不到C ++编译器。
不,C中不支持new
和delete
。
<小时/> *但是,在我看来,你应该强烈考虑为任何非平凡复杂的应用程序切换到C ++。 C ++具有比C更强大的高级构造(例如智能指针,容器,模板),简化了C中的大量繁琐工作。学习如何有效地使用它们需要一段时间,但从长远来看,它们值得的。 子>
答案 1 :(得分:4)
请记住,C和C ++实际上是完全不同的语言。它们共享一些通用语法,但C是一种过程语言,C ++是面向对象的,因此它们是不同的编程范例。
gcc作为C编译器应该可以正常工作。我相信MinGW使用它。它还有可以指定的标志,以确保它使用正确版本的C(例如C99)。
如果您想坚持使用C,那么您将无法使用new
(它不是C语言的一部分),但是为共享库迁移到C ++应该没有任何问题,只要你在你做的时候戴上面向对象的帽子。
我建议你坚持使用你更熟悉的语言。您使用new
这一事实表明这将是C ++,但这取决于您。
答案 2 :(得分:1)
gcc -std=c90
调用它,以确保它不会出现在任何Gnu或C ++扩展中。malloc
/ calloc
是便携式的,可以安全地在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 ++中开发它。既然这是业余爱好,那就没关系,但已经有这样的图书馆了。