【问题标题】:What does the 'keyword' phrase do in header file?头文件中的“关键字”短语有什么作用?
【发布时间】:2020-03-31 11:08:39
【问题描述】:

不要使用 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 和值。

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

【问题讨论】:

  • 这是用户自定义类型
  • 这看起来像X macro。例如,它可以用于从相同的数据创建一个枚举和相应的字符串数组。 (如果是这样,以后应该有另一个 undef 和 keyword 的重新定义。)

标签: c++ keyword


【解决方案1】:

#define 表示您正在制作宏。 keyword(key) 表示您正在该宏中创建一个函数,该函数接受一个参数 key。最后一个key 表示您正在使用该关键参数,然后您正在使用它做一些事情。它可以是任何东西,你可以std::cout 它,或者其他任何东西。


当您调用该宏时,您传入宏keyword 并输入任何内容作为键。

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

【讨论】:

  • 嗨,这很有意义......谢谢!我在更下方找到了这条线:enum parameters_enum PARAMETER_KEYWORDS - 所以考虑一下,他们似乎只是在枚举关键字并为每个关键字分配一个数字(从 0 开始)作为 ID。来自 py 这似乎是一种非常迂回的做事方式?为什么不只写一行:enum parameters_enum {LIST OF PARAMS}
【解决方案2】:

注意线条

keyword (SOME_CONSTANT), \

都是宏的一部分。也就是说,它们将出现在宏 SPCDLL_ERROR_KEYWORDSPARAMETERS_KEYWORDS 展开的任何地方。

而且,无论在哪里进行扩展,它都会在您的代码 sn-p 的最后一行中使用 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_KEYWORDS 内产生keyword() 调用的实际计数。

我不知道这些宏在什么上下文中实际使用/有用,但这样的构造通常用于某些特定目的:keyword(FOO) 的效果与 FOO 本身基本相同,但它标记将FOO 用于其他用途。这样的其他用途可以在一些其他宏中,或用于处理源代码的其他工具中。像文档工具、linter、自动头文件生成脚本等等。

找出答案的唯一方法实际上是寻找表达式\<keyword\> 在整个代码库中的使用位置。最有可能的是,这会让您偶然发现提供提示的 cmets,和/或一些实际执行附加处理的脚本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-21
    • 1970-01-01
    • 1970-01-01
    • 2019-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-12
    相关资源
    最近更新 更多