相关疑难解决方法(0)

通过优化,使用C,gcc,C99和宏改进微控制器的简约OOP

我经常用C编程微控制器,因为C++编译器通常不可用,或者由于各种错误而无法制作极小的代码.但是,为了便于维护,OOP"语法糖"通常非常方便,因为它可以更加清晰地封装硬件程序.所以我想知道是否有办法在C中进行OOP语法,尽可能使OOP开销(在不需要时)以可移植的方式进行优化.例如:这将针对不同微控制器针对gcc进行优化,或者如果gcc不适用于该微控制器,则可能使用gcc的预处理器和通用ANSI-C编译器.

我发现只有线程,像这样,在C中进行OOP时,优雅的方式来模拟'this'指针?通常通过将指针嵌入到结构中来执行OOP,但这并不总是我想要的,因为当我对虚拟方法不感兴趣时​​,它会浪费内存,或类似的东西.我总是可以在需要这些功能的链接中遵循编码风格,但我想开发不需要它们的技术; 例如,我只是希望能够使用OOP范例进行编程,使用简单易懂的代码(不一定是C++,尽管我喜欢C++),并且当一些OOP范例不使用时仍然能够实现最小的C程序内存使用.

因此,我使用gcc和C99进行实验,因为一般来说gcc 3.2或更高版本适用于大多数平台; 并意识到我可以使用C99中的sizeof()和typeof()编译器函数自动索引类(来自未使用/未初始化的联合成员的"技巧")(所以类必须是带有子结构的联合),命令访问由宏创建的编译时常量查找表,它可以绑定数据和方法,并保证所有类型检查.等等

例如:GCC允许优化const结构和数组,当它们的成员只作为常量表达式访问时,所以我想我可以用它来构建一个基于宏的编译时绑定系统,其中处理OOP开销GCC实际上优化了最终的二进制文件.

使用这个系统,我现在可以进行可变宏方法调用,例如:M(a,init,"with","any","parameters",7)查找变量a的类型,调用方法init,使用变量number参数...

请参阅下面的代码示例,并尝试它们 - 它比解释简单:使用g​​cc -E查看宏扩展,并注意仅ANSI编译器,typeof()运算符必须替换为(void*)类型转换; 类型检查仅适用于GCC.

代码可以剪切并粘贴到文本编辑器中,文件名在第一行,它可以在普通的PC系统上编译和运行.

虽然我确实成功地摆脱了每个结构中的单个指针以"指回"一个类的方法列表,这可以节省有限内存微控制器中的内存,但我还是无法弄清楚如何让编译器进行优化out unused指针,因为我必须使用(void*)指针将类保存在数组中,这些指针需要一个内存地址(结构地址)和一个链接器实例; 并且不要优化.

所以:我想知道是否有人知道通过制作某种初始化的方法结构来改进我的解决方案的方法,该结构将在编译后优化(没有链接器地址),例如:当它的成员仅作为常量表达式访问时码.本质上,我需要能够在数组中查找元素,其中每个数组元素的初始化部分是不同的classXXX_mt,而不是所有类型为(void*)的classXXX_mt的地址列表.

如果有人能想到一个简单的解决方案,还有其他两个我需要帮助的改进; cpp(c-pre-processor)不允许通过标记连接从前一个宏中定义新的宏(据我所知),所以我必须制作固定长度的宏列表(在我的例子中最多10个) )持有类定义; 这意味着我在一个程序中最多只能有10个班级; 但理想情况下,我想要一种方法来使我的代码更通用,以便cpp可以动态创建可变长度列表.例如:问题与c预处理器无法自动"计数"有关.

其次,当我尝试为更新版本的GCC使用匿名结构时,我可能会删除访问ISO-C中的成员数据所需的额外"m",例如:foo.m.mydata,删除"m"从类联合定义中命名,并使用gcc -std = c11进行编译,然后它只是给了我错误声称结构定义没有...所以,即使在GCC 4.8中,联合内部的匿名结构也不起作用,尽管它应该; 我怎样才能让匿名结构起作用?

下面是我如何测试和实现包含文件voidbind.h的示例,该文件构建类列表并将方法静态链接到该类类型的变量.

最终,系统允许我像这个例子一样编程; 我用gcc 4.0到4.9编译没有问题:

//classtest.c
#ifndef MACROCHECK  // Don't macro expand stdio.h, it's ugly...
#include <stdio.h>  // to see macros, do gcc -D MACROCHECK -E classtest.c
#endif
#include "class1.h" // include example class, library.

#define _VOID_FINALIZE
#include "voidbind.h" // Make class list finalized, no …
Run Code Online (Sandbox Code Playgroud)

c oop gcc pointers

9
推荐指数
1
解决办法
559
查看次数

标签 统计

c ×1

gcc ×1

oop ×1

pointers ×1