#define C_TX_ TX_
#define C_RX_ RX_
enum Test
{
C_TX_MAC = 0x0100, // Pre-Processor should replace C_TX_ to TX_
C_RX_MAC = 0x0101 // But Not Working.
};
int main(int argc, char *argv[])
{
cout << TX_MAC; // HOW TO PRINT ?
cout << RX_MAC; // HOW TO PRINT ?
return true;
}
答案 0 :(得分:2)
预处理器仅对整个令牌的字符串进行操作。否则会有混乱。
尝试:
#define C_TX_MAC TX_MAC
#define C_RX_MAC RX_MAC
答案 1 :(得分:2)
您无法使用预处理器拆分令牌。你需要
#define C_RX_MAC RX_MAC
#define C_TX_MAC TX_MAC
(当然有一些丑陋的解决方案,例如添加预处理步骤:
sed s/C_ADDR_// x.cpp | g++ -x c++ -
但sed
不知道背景。它将取代字符串,例如cout << "And C_ADDR_RX = "
与cout << "And RX = "
。{/ p>
答案 2 :(得分:0)
正如其他答案中所述,预处理器使用空格来计算令牌定义的位置,并且不能“部分通过”替换它。也许你可以尝试“查找/替换文件”来重命名您的源代码中的变量直接.Visual Studio的查找和替换功能可用于替换任何文件夹/子文件夹中的任何出现,或者如果您不与Microsoft一起运行,那么还有一些其他程序,如NotePad++提供相同的两者都支持正则表达式,以实现更有针对性的查找/替换查询
答案 3 :(得分:0)
预处理器替换了令牌,C_TX_MAC
是一个完整的令牌。
但是,你可以通过一些宏连接相当容易地实现这一点:
#include <iostream>
#define foo(x) C_ ## x
enum Test
{
C_TX_MAC = 0x0100, // Pre-Processor should replace C_TX_ to TX_
C_RX_MAC = 0x0101 // But Not Working.
};
int main()
{
std::cout << foo(TX_MAC) << ' ' << foo(RX_MAC) << '\n';
}
易。无需sed
,也无需在文本编辑器中进行查找和替换。