'Keyword'短语在头文件中有什么作用?

4

我不擅长C++,所以这可能是一个愚蠢的问题。 我正在查看一个头文件.h,在其中参数ID应该被定义,根据文档。 我找到了参数所在的行,它们如下:

#define  SPCDLL_ERROR_KEYWORDS \
{ \
  keyword (NONE), \
  keyword (OPEN_FILE), \
  keyword (FILE_NVALID), \
  keyword (MEM_ALLOC), \
};

#define  PARAMETERS_KEYWORDS \
{ \
  keyword (LIMIT_LOW), \
  keyword (LIMIT_HIGH), \
  keyword (LEVEL), \
  keyword (HOLDOFF), \
};

#ifdef keyword
#undef keyword  /* prevents redefinition warning */
#endif

#define keyword(key) key

然而,我已经搜索了一下,但并没有找到关键字(key)行具体是做什么的?它是根据列表中的顺序为每个参数和ID分配编号吗?那会使LIMIT_LOW,ID=1吗?为什么它没有明确定义。另外,由于有两个关键字定义列表,它是如何工作的?

我来自Python世界,在那里我会将它们定义为两个字典,分别针对Error_names和Parameter_vals的ID和值。

如果有人能解释一下这个问题,我将不胜感激。


2
这是一个用户定义的类型。 - stark
看起来像是X宏。例如,可以使用它从相同的数据创建枚举和相应的字符串数组。(如果是这样,那么后面应该有另一个undef和keyword的重新定义。) - M Oehm
2个回答

4

#define 意味着你正在创建一个宏定义。 keyword(key) 意味着你正在该宏定义中创建一个函数,该函数接受一个参数key。最后的key意味着你正在使用该参数key,并对其进行一些处理。这可以是任何东西,你可以将其输出到std::cout或者其他任何地方。


当你调用该宏时,你传递宏keyword并为key设置任何值。

在文件顶部使用X 宏,并在这些函数中使用你的keyword宏。


嗨,这很有道理...谢谢!我在下面找到了这行代码:enum parameters_enum PARAMETER_KEYWORDS - 所以考虑一下,它们只是枚举关键字并为每个关键字分配一个数字(从0开始)作为ID。从py来看,这似乎是一个非常迂回的方式?为什么不只有一行代码:enum parameters_enum {PARAMS列表} - BloodSexMagik

0
请注意这些行。
keyword (SOME_CONSTANT), \

都是宏的一部分。也就是说,无论何处扩展宏SPCDLL_ERROR_KEYWORDSPARAMETERS_KEYWORDS,它们都会出现。

而且,无论扩展发生在哪里,它都将使用代码片段最后一行中的keyword()定义。因此,表达式PARAMETERS_KEYWORDS实际上会扩展为

{
    LIMIT_LOW,
    LIMIT_HIGH,
    LEVEL,
    HOLDOFF,
};

然而,这取决于在使用时如何定义keyword(),它可以被定义为扩展到C预处理器能够生成的任何内容。例如

#define keyword(foo) 1
char foo[] = SPCDLL_ERROR_KEYWORDS;
printf("There are %d SPCDLL_ERROR keywords\n", sizeof(foo));

这将产生SPCDLL_ERROR_KEYWORDSkeyword()调用的实际计数。

我不知道这些宏实际上在哪种情况下被使用/有用,但是这样的构造通常会有一些特定的目的: keyword(FOO)的效果基本上与FOO本身相同,但它标记了其他用途中FOO的使用。这些其他用途可以是其他宏,或者用于处理源代码的其他工具。例如文档工具、linters、自动生成头文件脚本等等。

唯一的方法是实际上在整个代码库中搜索表达式\<keyword\>的使用情况。很可能,这会让您遇到提供提示的注释和/或实际执行其他处理的脚本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接