Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在预处理器中转换字符串值_C++_C Preprocessor - Fatal编程技术网

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不可能直接实现:预处理