如何理解代码中的以下宏

时间:2019-05-14 12:56:00

标签: c++ c

我试图理解应用程序的代码库,但是在解释以下宏时遇到问题。谁能帮助我理解下面的代码。

#define LIST_OF_AP_COMMANDS(ENTRY) \
  ENTRY(WLAN_AP_SET_IP,         2, (WEP_MODE | WPA_MODE | NONE_MODE), "ifconfig wlan1 %s > /dev/null",                                         abAPIpAddress) \
  ENTRY(WLAN_AP_REMOVE_NETWORK, 2, (WEP_MODE | WPA_MODE | NONE_MODE), "wpa_cli -iwlan1 remove_network 0 > /dev/null") \
  ENTRY(WLAN_AP_ADD_NETWORK,    2, (WEP_MODE | WPA_MODE | NONE_MODE), "wpa_cli -iwlan1 add_network > /dev/null") \
  ENTRY(WLAN_AP_SET_SSID,       2, (WEP_MODE | WPA_MODE | NONE_MODE), "wpa_cli -iwlan1 set_network 0 ssid '\"%s\"' > /dev/null",               CON_acbSSID) \
  ENTRY(WLAN_AP_SET_PASS,       2, (WPA_MODE), "wpa_cli -iwlan1 set_network 0 psk '\"%s\"' > /dev/null",                CON_acPassword) \
  ENTRY(WLAN_AP_SET_PASSWORD,   2, (WEP_MODE | WPA_MODE | NONE_MODE), "wpa_cli -iwlan1 set_network 0 key_mgmt %s > /dev/null",           pcSecurityTypes[CON_bSecurityType] ) \
  ENTRY(WLAN_AP_SET_FREQUENCY,  2, (WEP_MODE | WPA_MODE | NONE_MODE), "wpa_cli -iwlan1 set_network 0 frequency %d > /dev/null",                CON_awWifiFreqs[ CON_bChannel ]) \
  ENTRY(WLAN_AP_SET_MODE,       2, (WEP_MODE | WPA_MODE | NONE_MODE), "wpa_cli -iwlan1 set_network 0 mode 2 > /dev/null") \
  ENTRY(WLAN_AP_SET_MODE,       2, WEP_MODE , "wpa_cli -iwlan1 set_network 0 wep_key0 %s > /dev/null", CON_acPassword) \
  ENTRY(WLAN_AP_SET_MODE,       2, WEP_MODE , "wpa_cli -iwlan1 set_network 0 wep_tx_keyidx 0 > /dev/null") \
  ENTRY(WLAN_AP_ENABLE_NETWORK, 10, (WEP_MODE | WPA_MODE | NONE_MODE), "wpa_cli -iwlan1 enable_network 0 > /dev/null" )

//! Expander with the execution of each command
#define EXECUTE_WLAN_COMMANDS(index, delay, mode, command, ...) \
    if( ( abSecurityModes[CON_bSecurityType] & mode ) ) { CON_cExecuteWlanCommand(command, ##__VA_ARGS__); } else { printf("wpa_cli %d %d\r\n", abSecurityModes[CON_bSecurityType], mode); } \
    sleep( delay );

1 个答案:

答案 0 :(得分:1)

X-macros是一种传统技术,用于处理使用宏预处理器(如C / C ++预处理器)的语言的代码生成。这个想法是,您有一个元素列表-类型,枚举常量,消息字符串等-并且您需要多次使用该列表才能生成代码.fir示例,您可能想同时错误消息列表和enum,用于定义每个错误的符号名称。或者,也许您有几种不同的结构,并且需要为每种结构创建两个或更多特定功能。 (在C ++中,您可能会在这种情况下使用模板。)

名称“ X-macro”来自原始模式,在这种模式中,列表宏在列表的每个元素上调用了具有给定名称的宏(按照约定X),从而导致了类似:

#define X(name, value) … // some use of name and value
HANDLE_LIST
#undef X

#define X(name, value) … // sone other use
HANDLE_LIST
#undef X

// etc.

但是在某些时候,使用列表处理程序变得更加普遍,该处理程序以宏的名称作为参数来调用(所谓的“高阶宏”)。这样可以使用更有意义的名称,并且避免重复定义X。 (如果您只列出一个列表,则特别有用。)

这就是您在这里看到的。