我试图将标识符和类型传递给应该声明变量的宏
#define DECLARE_PARAM(TYPE, PARAM) \
TYPE PARAM; \
gboolean __exist_##PARAM = FALSE
...
DECLARE_PARAM(char[100], title);
但是我收到了编译错误:
expected identifier or '(' before '[' token
DECLARE_PARAM(char[100], title);
^
修改
它适用于简单类型,如char或int,有没有办法可以传递数组类型?
CONTEXT
我实际上是在尝试创建一个可变参数函数,它接受一个由空格"title color other"
分隔的参数名称,然后是它们的值,这样它就会被调用:
create_window("color title", "blue", "My window");
因此该函数会将默认值赋予无指定参数。
我把它写成测试,但现在我需要把这个样板代码放到像这样的宏中 例如:
DEFAULT_PARAM(title, char[100], "My window");
这是我写的测试
#define DECLARE_PARAM(TYPE, PARAM) \
TYPE PARAM; \
gboolean __exist_##PARAM = FALSE
GtkWidget *fenetre_creer(char *keys, ...)
{
va_list args;
DECLARE_PARAM(char[100], titre);
DECLARE_PARAM(char[100], icon);
DECLARE_PARAM(int, padding);
GList *argList = read_args(keys);
int nombreArguments = g_list_length(argList);
va_start(args, nombreArguments);
GList *iterator = argList;
while(iterator)
{
char *argument = iterator->data;
if(strcmp(argument, "titre"))
{
strcpy(titre, va_arg(args, char*));
_titre_param = TRUE;
}
else if(strcmp(argument, "icon"))
{
strcpy(icon, va_arg(args, char*));
_icon_param = TRUE;
}
else if (strcmp(argument, "padding"))
{
padding = va_arg(args, int);
_padding_param = TRUE;
}
iterator = iterator->next;
}
var_end();
if(!__exist_titre)
strcpy(titre, "Titre de la fenetre");
if(!__exist_padding)
padding = 10;
if(!__exist_icon)
strcpy(icon, "");
printf("titre : %s\n", titre);
printf("padding : %d\n", padding);
printf("icon : %s\n", icon);
}
答案 0 :(得分:2)
正如其他人所说,char[100] foo
是合法的Java,但不是合法的C或C ++,至少在我用过的方言中是这样。
我不保证,但你可以尝试:
typedef char Char100[100];
DECLARE_PARAM(Char100, titre);
我怀疑这会奏效。 HOWEVER ,使用宏为语言添加语法几乎总是一个坏主意。 你真的没有为自己节省那么多工作,你正在创建一个不太完整的C程序,这对其他C程序员来说更难以使用。不要做这样的琐碎事情,如果你必须这样做记录它致死。
特别是因为你可以更明确地说同样的事情
typedef char Char100[100];
Char100 titre;
致力于编辑“上下文”:
默认参数是一个非常不同的问题。为此,定义包装函数,该函数接受参数的子集并在调用通用版本之前填写缺失值。或者定义函数以识别保留值(null或-1,或者不会发生的其他情况)作为使用该参数的默认值的请求。比试图扭曲语言的语法要清晰得多。