【发布时间】:2012-02-16 16:10:50
【问题描述】:
我正在编写一些特定于硬件的代码,我想在其中使用 C 宏,宏定义将是这样的:-
#define VALIDATE_RESOURCE_AND_ALLOCATE(MODE,RESOURCE1) if(a[MODE][RESOURCE1] != x1) || \
(a[MODE][RESOURCE1] != y1)) \
a[MODE][RESOURCE1]=x3;
因为有时我可以分配超过 1 个资源,例如:-
#define VALIDATE_RESOURCE_AND_ALLOCATE_1(MODE,RESOURCE1,RESOURCE2) if(a[MODE][RESOURCE1] != x1) || \ (a[MODE][RESOURCE1] != y1)) \ a[MODE][RESOURCE1]=x3; if(a[MODE][RESOURCE2] != x1) || \ (a[MODE][RESOURCE2] != y1)) \ a[MODE][RESOURCE2]=x3;
我有什么办法可以编写一个宏,它涵盖了这两种情况,因为它需要可变数量的参数?
我在 printf 宏的宏中使用了可变数量的参数,但是我将如何使用它们各自的名称来处理这些参数,例如,如果我修改 MACRO 定义,例如:0-
#define VALIDA_RESOURCE_AND_ALLOCATE(MODE,.....)
如何识别 RESOURCE1、RESOURCE2?
【问题讨论】:
-
你“可以”但不能。你现在所拥有的工作。我将在第一个中重新定义第二个:
#define VALIDATE_RESOURCE_AND_ALLOCATE_1(MODE, RESOURCE1, RESOURCE2) VALIDATE_RESOURCE_AND_ALLOCATE(MODE, RESOURCE1); VALIDATE_RESOURCE_AND_ALLOCATE(MODE, RESOURCE2),然后我会将它们中的 both 包装在do { ... } while(0)中,以便它们表现得像正确的语句。 (另外,不要使用分号的宏。) -
但是在这种情况下,如果假设第一个宏失败,我想退出,除非我检查它的返回值,否则这是不可能的......
-
正如目前所写,这些宏都没有任何返回值。
-
是的......我很抱歉不是很清楚......是的,但它应该返回一个错误代码,以防资源被使用。
-
然后你需要重写它以返回所说的代码。我建议使用三元条件
?:而不是if,然后用逗号运算符执行赋值并返回值(代码x = y, z会将y的值赋给x,但返回z的值)。然后,对于双精度版本,您可以将这些返回值与布尔运算符(如果您希望短路行为并且返回值是通过/失败)或按位运算符(对于没有短路或更复杂的返回值)组合.就目前而言,我不知道你会实际返回什么。
标签: c unix macros embedded c99