Tag:

实验:面向对象的C?

可能重复: 你能用C编写面向对象的代码吗? 嗨! 只是为了它的乐趣,我在最后两天一直在尝试用纯C创建一个非常简单,非常简单的对象环境。我一直在玩宏,动态链接,类型描述结构等,我到达了以下内容: string_o str = new(String, “hello world”); list_o list = new(List); List.pushf(list, str); printf(“In the list: \”%s\”\n”, String.text(List.popf(list))); delete(list); delete(str); 看起来和工作有点好,但我无法找到伪造实例方法的方法。 我不能通过Class.function(instance) ,不能没有函数名的全局宏替换,这会破坏封装的目的。 同样,这是一个实验,只是为了挑战和乐趣=)。 你们能帮我找出办法吗? 我不想使用额外的预处理,只需要普通的C和GCC宏。 编辑>忘了说 – 我不希望每个实例在其结构中包含函数指针。 这会给我方法语法好,但这意味着一个4字节的数据对象会有十几个函数指针复制到每个实例。 这有点像作弊= P哈哈 提前致谢!

C99有#define吗?

我想用C99做一些事情,否则以另一种方式执行。 要检查的#define是什么? #ifdef C99 … #else … #endif

极少数情况下必须使用MACRO

调试宏可能会花费很多时间。 我们最好避免使用它们,除非在非常罕见的情况下,常量,函数和模板都不能达到我们想要的效果。 什么是罕见的情况?

从C ++宏创建字符串列表和枚举列表

为了使我的代码更短更容易更改,我想替换类似的东西 enum{ E_AAA, E_BBB, E_CCC }; static const char *strings{“AAA”, “BBB”, “CCC” }; 使用宏,如INIT(AAA,BBB,CCC); 但是当我尝试使用变量参数和字符串化做一个宏时,我得到一个错误,因为没有声明参数。 有关如何做到这一点的任何想法?

C中的宏生成宏?

我想让C预处理器为我生成宏(即,我只使用C99)。 我写了一个宏 #define make_macro(in) 当我放 make_macro(name1) make_macro(name2) 稍后在代码中,它将扩展为 #define name1(…) name1_fn(name1_info, __VA_ARGS__) #define name2(…) name2_fn(name2_info, __VA_ARGS__) 然后我就可以使用name1和name2作为(宏实现的)函数。 我认为我在两个步骤中都使用了宏:使用宏来重复填充模板是有意义的,并且除了通过宏之外,可变参数处理将不起作用。 那么占位符是做什么的呢? 在这一点上,我开始相信它在C99中是不可能的,但也许我错过了语法的一些细节。

当用作较大数学表达式的一部分时,使用宏导致错误输出 – 为什么会发生这种情况?

这是一个正常的C例行程序,我在一些问题库中找到了。 如下所示: #define CUBE(p) p*p*p main() { int k; k = 27 / CUBE(3); printf(“%d”, k); } 根据我的理解和知识,K的值应为1,因为在预处理期间CUBE(3)将被3 * 3 * 3替换,并且在随后的编译之后它将给出值1,但它已显示值81这让我很想知道它是怎么发生的。 任何人都可以certificate上面这个问题的答案是正确的。

何时可以省略宏中参数的括号?

通常我常常觉得围绕宏定义中的参数的一些括号是多余的。 把一切都括起来太不方便了。 如果我可以保证参数不需要括号,我可以省略括号吗? 或者强烈建议将它们括起来? 我写的时候想出了这个问题: #define SWAP_REAL(a, b, temp) do{double temp = a; a = b; b= temp;}while(0) 我认为如果参数在宏中显示为l值,则可以省略括号,因为这意味着参数出现时没有其他操作。 我的理由是: 赋值符号的关联优先级仅高于逗号。 您不能将编译器混淆为认为您的参数是带有逗号的表达式。 例如, SWAP(a, b, b)将不会被成功解释为 do{double temp = a, b; a, b = b; b= temp;}while(0) 哪个可以通过编译。 我对吗? 任何人都可以给我一个反例吗? 在以下示例中, #define ADD(a, b) (a += (b)) 我认为这个论点不需要用括号括起来。 在这种特殊情况下,既不需要参数b ,对吗? @JaredPar: #include #define ADD(a, b) […]

将#define X宏值替换为编译命令中指定的另一个值

假设我有这个代码: #include #ifndef STR #define STR “HELLO” #endif int main() { printf(STR “WORLD \n”); return 0; } 这基本上转换为:如果未定义STR,则将其定义为“HELLO”,因此程序输出将是 你好,世界 现在,我的问题是:在使用gcc编译时如何修改此STR值? 例如,我想将“HELLO”更改为“HI”而不更改源(program.c)文件中的任何内容。 这样做的gcc语法是什么? 我试过了 gcc -Wall program.c -DSTR =“HI”-o program 但它没有产生预期的产量。 有什么建议? 谢谢!

C ++中##运算符的用途是什么,它叫什么?

我正在浏览DirectX March 2009 SDK附带的DXUTCore项目,并注意到它们使用宏来创建通用访问器,而不是使用普通的访问器方法,类似于以下内容: #define GET_ACCESSOR( x, y ) inline x Get##y() { DXUTLock l; return m_state.m_##y;}; … GET_ACCESSOR( WCHAR*, WindowTitle ); 似乎##运算符只是将第二个参数中的文本插入到宏中,以使用该文本创建对变量进行操作的函数。 这是C ++中的标准(即不是Microsoft特定的)吗? 它的使用是否被视为良好做法? 那个运营商叫什么?

宏和后增量

这是一些奇怪的宏观行为,我希望有人可以阐明: #define MAX(a,b) (a>b?a:b) void main(void) { int a = 3, b=4; printf(“%d %d %d\n”,a,b,MAX(a++,b++)); } 输出为4 6 5. b的值增加两次,但在MAX显示其值之前不增加。 任何人都可以告诉我为什么会这样,以及如何预测这种行为? (应避免使用宏的另一个例子!)