- 概述:**
我正在使用一个业余爱好应用程序。我希望我的程序能够坚持"纯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,但是,没有一个以前的答案似乎对我来说很清楚。
7条答案
按热度按时间bq3bfh9z1#
记住C和C实际上是完全不同的语言,它们共享一些共同的语法,但C是过程语言,而C是面向对象的,所以它们是不同的编程范式。
gcc作为一个C编译器应该工作得很好。我相信MinGW使用它。它也有一些标志,你可以指定来确保它使用的是正确的C版本(例如C99)。
如果你想坚持使用C语言,那么你就不能使用
new
(它不是C语言的一部分),但是对于一个共享库来说,转移到C应该没有任何问题,只要你戴上面向对象的帽子。我建议你坚持使用你更熟悉的语言,事实上你使用的是
new
,这意味着你将使用C,但这取决于你。cnjp1d6j2#
1.你可以使用GCC作为C编译器。为了确保它编译成C,使用
-x c
选项。你也可以指定一个特定版本的C标准,例如-std=c99
。为了确保你没有使用任何GCC特定的扩展,你可以使用-pedantic
标志。我相信其他编译器也有类似的选项。malloc
和calloc
确实是C中分配内存的方式。1.这取决于您。* 您说您希望跨平台,但C本质上与C一样“跨平台”。然而,如果您在嵌入式平台(如微控制器或DSP)上工作,您可能找不到适用于它们的C编译器。
1.不支持,C语言中不支持
new
和delete
。ni65a41a3#
gcc -std=c90
调用它,以确保它不会在任何Gnu或C++扩展中出错。malloc
/calloc
是便携式的,可安全地在C中使用qncylg1j4#
最重要的提示是用.c扩展名保存文件并禁用编译器扩展名。在Visual C和gcc(以及MinGW)上,这会使它们进入C模式,在那里C添加将被禁用。
您还可以使用
-std=c90
(或c99
,取决于您要使用的C标准;这些也禁用GNU扩展)在gcc
中,/Tc
在VC++中(在这里要禁用MS扩展,您必须使用/Za
)。jrcvhitl5#
如果使用Visual Studio,只需将文件制作为.c(尽管它不是严格意义上的C编译器,但它假装是,而且在大多数情况下,已经足够好了)
如果你想用C就用C,如果你想用C就用C
所以坚持使用malloc等....在C++中你会使用智能指针。
ocebsuys6#
你不必坚持用C来创建跨平台的非GUI库。你也可以用C++来开发它。既然这是你的爱好,那也没关系,但是已经有这样的库了。
epfja78i7#
似乎从C17(或技术名称ISO/IEC 9899:2018)开始,
new
关键字就得到了支持。要实现这一点,如果您使用的是Visual Studio代码,请在c_cpp_properties.json
文件更新中:"cStandard": "c17"
,以及"cppStandard": "c++17"