我试图理解应用程序的代码库,但是在解释以下宏时遇到问题。谁能帮助我理解下面的代码。
#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 );
答案 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
。 (如果您只列出一个列表,则特别有用。)
这就是您在这里看到的。