C++ 在预处理器中转换字符串值
在将表达式应用于预处理器之前,我需要将其转换为结果。这可能是一个简单的问题,但我想不出一个办法 我的预处理器是这样的:C++ 在预处理器中转换字符串值,c++,c-preprocessor,C++,C Preprocessor,在将表达式应用于预处理器之前,我需要将其转换为结果。这可能是一个简单的问题,但我想不出一个办法 我的预处理器是这样的: #define ABCD(BITPOS) \ if(BIT##BITPOS##_MASK & 0x01) { \ Do something; } 而BIT0\u掩码到BIT100\u掩码是在某个地方定义的。 如果我调用ABCD(5),预处理器将其转换为BIT5\u掩码,它工作正常 但是,我想这样称呼它: ABCD(开始值+2), 它给我的编译错误是,B
#define ABCD(BITPOS) \
if(BIT##BITPOS##_MASK & 0x01) { \
Do something; }
而BIT0\u掩码
到BIT100\u掩码
是在某个地方定义的。
如果我调用ABCD(5)
,预处理器将其转换为BIT5\u掩码
,它工作正常
但是,我想这样称呼它:
ABCD(开始值+2)
,
它给我的编译错误是,BITSTART\u VAL
未声明,)\u MASK
未定义,以及一大堆相关错误
我怎样才能让它工作?感谢您的回复。看起来您需要的是
内联
函数,而不是宏
inline size_t ABCD(unsigned int bitmask)
{
if (bitmask & 0x01U)
{
something();
}
}
inline
关键字将向编译器提示您希望粘贴而不是调用代码。看起来您需要的是inline
函数而不是宏
inline size_t ABCD(unsigned int bitmask)
{
if (bitmask & 0x01U)
{
something();
}
}
inline
关键字将向编译器提示您希望粘贴而不是调用代码。看起来您需要的是inline
函数而不是宏
inline size_t ABCD(unsigned int bitmask)
{
if (bitmask & 0x01U)
{
something();
}
}
inline
关键字将向编译器提示您希望粘贴而不是调用代码。看起来您需要的是inline
函数而不是宏
inline size_t ABCD(unsigned int bitmask)
{
if (bitmask & 0x01U)
{
something();
}
}
inline
关键字将提示编译器希望粘贴而不是调用代码。预处理器宏系统无法计算算术运算符。它只能将令牌拼接在一起并替换标识符
你需要找到另一个解决方案
如果您真的必须这样做,宏的工作人员创建宏来执行一些基本的算法,只使用拼接和替换作为基础。但是,这不是适合此作业的工具。预处理器宏系统无法计算算术运算符。它只能将令牌拼接在一起并替换标识符 你需要找到另一个解决方案
如果您真的必须这样做,宏的工作人员创建宏来执行一些基本的算法,只使用拼接和替换作为基础。但是,这不是适合此作业的工具。预处理器宏系统无法计算算术运算符。它只能将令牌拼接在一起并替换标识符 你需要找到另一个解决方案
如果您真的必须这样做,宏的工作人员创建宏来执行一些基本的算法,只使用拼接和替换作为基础。但是,这不是适合此作业的工具。预处理器宏系统无法计算算术运算符。它只能将令牌拼接在一起并替换标识符 你需要找到另一个解决方案
如果您真的必须这样做,宏的工作人员创建宏来执行一些基本的算法,只使用拼接和替换作为基础。不过,这不是适合这份工作的工具。谢谢您的回复。忘了提及,所有的代码都是我无法触摸的现有代码,除了新的ABCD呼叫(开始值+2)谢谢您的回复。忘了提及,所有的代码都是我无法触摸的现有代码,除了新的ABCD呼叫(开始值+2)谢谢您的回复。忘了提及,所有的代码都是我无法触摸的现有代码,除了新的ABCD呼叫(开始值+2)谢谢您的回复。忘了提一下,所有这些都是我无法触及的现有代码,除了新的ABCD(START_VAL+2)调用之外。你到底想实现什么?你告诉我们你是怎么做的,却不告诉我们那是什么。从外观上看,如果我们知道您要做什么,我们可能会建议一种更好的方法。IIRC不可能直接实现:预处理器会延迟计算这些表达式(=仅在需要时,例如,对于条件包含)。boost预处理器库包含(至少)两种技术来处理这个问题:@Emmet:基本上,这个宏是一个遗留代码,它确实在内部创建了一些get/set/isSet/clrBit函数,比我上面提到的更复杂。基本上,我上面的if检查是isSetxxx()函数的一部分。您实际上想要实现什么?你告诉我们你是怎么做的,却不告诉我们那是什么。从外观上看,如果我们知道您要做什么,我们可能会建议一种更好的方法。IIRC不可能直接实现:预处理器会延迟计算这些表达式(=仅在需要时,例如,对于条件包含)。boost预处理器库包含(至少)两种技术来处理这个问题:@Emmet:基本上,这个宏是一个遗留代码,它确实在内部创建了一些get/set/isSet/clrBit函数,比我上面提到的更复杂。基本上,我上面的if检查是isSetxxx()函数的一部分。您实际上想要实现什么?你告诉我们你是怎么做的,却不告诉我们那是什么。从外观上看,如果我们知道您要做什么,我们可能会建议一种更好的方法。IIRC不可能直接实现:预处理器会延迟计算这些表达式(=仅在需要时,例如,对于条件包含)。boost预处理器库包含(至少)两种技术来处理这个问题:@Emmet:基本上,这个宏是一个遗留代码,它确实在内部创建了一些get/set/isSet/clrBit函数,比我上面提到的更复杂。基本上,我上面的if检查是isSetxxx()函数的一部分。您实际上想要实现什么?你告诉我们你是怎么做的,却不告诉我们那是什么。从表面上看,如果我们知道你想做什么,我们可能会建议一个更好的方法。IIRC不可能直接实现:预处理