c - 将标识符和类型传递给宏

标签 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);
                     ^

编辑

它适用于 char 或 int 等简单类型,有没有一种方法可以传递数组类型?

语境

我实际上是在尝试制作一个可变参数函数,该函数采用由空格分隔的参数名称字符串 "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);

}

最佳答案

正如其他人所指出的,char[100] foo 是合法的 Java 但不是合法的 C 或 C++,至少在我使用的方言中是这样。

我不能保证,但你可以试试:

typedef char Char100[100];
DECLARE_PARAM(Char100, titre);

我怀疑这会奏效。 但是,使用宏向语言添加语法几乎总是一个坏主意。您实际上并没有为自己节省那么多工作,而且您正在创建一个不完全是 C 的程序,其他 C 程序员将更难使用它。不要为了像这样的小事而做,如果你必须做,记录到死

特别是因为你可以把同样的话说得更清楚

typedef char Char100[100];
Char100 titre;

响应编辑“上下文”:

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

关于c - 将标识符和类型传递给宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22339648/

相关文章:

c - getter 函数如何知道 setter 函数是否被调用?

C 格式字符串 - 如何使用 sprintf 将前导零添加到字符串值?

c - 在 C 中伪造寄存器读取

android - 我如何获得 Android Bundle/Packager Identifier

javascript - 使用 jQuery 选择一个带有冒号的 ID

为 A9331 交叉编译 libcurl 和 openssl

c - 在c中查找唯一的任意大小的数字组合的算法

c++ - 是否有一个宏来检查给定函数是否存在

macros - Rust 中的过程宏解析异常

Oracle新手错误: ORA-00904 Invalid identifier when using "case when"