如何使用#define仅替换部分变量

时间:2010-04-15 05:38:14

标签: c++

#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;

}

4 个答案:

答案 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';
}

live demo

易。无需sed,也无需在文本编辑器中进行查找和替换。