Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将标识符和类型传递给宏_C_Macros_Identifier - Fatal编程技术网

C 将标识符和类型传递给宏

C 将标识符和类型传递给宏,c,macros,identifier,C,Macros,Identifier,我试图将标识符和类型传递给应该声明变量的宏 #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);

我试图将标识符和类型传递给应该声明变量的宏

#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,有没有一种方法可以传递数组类型

上下文

我实际上在尝试创建一个变量函数,它接受一个由空格分隔的参数字符串名称,然后是它们的值,所以它的调用方式如下:

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);

}

正如其他人所指出的,<代码> char(100)Fo< <代码>是合法的java,但不是合法的C++或C++,至少在我使用的方言中是这样的。 我不能保证,但你可以试试:

typedef char Char100[100];
DECLARE_PARAM(Char100, titre);
我想那会管用的然而,使用宏向语言中添加语法几乎总是一个坏主意。你真的没有节省那么多工作,而且你正在创建一个不完全是C语言的程序,这对其他C语言程序员来说将更难使用。不要为这种琐碎的事情而这样做,如果你一定要这么做,就把它记录下来

尤其是因为你可以把同样的事情说得更清楚

typedef char Char100[100];
Char100 titre;
响应“上下文”的编辑:


默认参数是一个非常不同的问题。为此,请定义包装函数,该函数接受参数的子集,并在调用通用版本之前填充缺少的值。或者定义函数将保留值(null、或-1或其他不会出现的值)识别为使用该参数的默认值的请求。比试图扭曲语言的语法要干净得多。

什么编译错误?这有点像猜谜游戏。请提供更多的上下文。它不是
char titre[100]
,不是
char[100]
titre吗?我不认为这与你的宏有关,它只是一个不正确的变量声明。很好,@computerfreaker。。。<代码> char(100)< /> >表单将是合法的C++,但我不相信它在C.中能工作,它可以通过使用TyPulf来给那个类型命名,我想……也注意,从双下划线<代码>代码> />代码开始的名称被保留用于实现(出于任何目的)。你在用它们玩火——如果你后来被烧死了,除了你自己,没有人可以责怪你。类似地,以下划线和大写字母开头的名称保留用于实现;事实上,您最好假设以下划线开头的标识符是保留的,您不应该使用它们。我知道我所做的不好:d。如果可能的话,我只需要在C中有默认参数。唯一的区别是额外的
bool\uuuuuuuuiXist\uTitre=false定义。但你的回答实质上与我的评论相呼应;我假设你在我的博客上写你的文章。@尤塞夫布C++:如果你想要C++的特性,请使用C++。这比与C战斗容易。@JonathanLeffler我希望我能:(.C是一个requirement@JonathanLeffler是的,同时思考。