在C++宏"int val = rand()"中创造新价值

Create new value in C++ macro "int val = rand()"

本文关键字:rand 创造 新价值 C++ int val      更新时间:2023-10-16

我正在尝试创建c++宏,它可以在"if"条件下检查时做一些事情。

我的宏在大多数情况下工作,但我有问题时,如果是创建临时值。当然,我可以将新值的创建移到"IF"之前,但这很麻烦,因为我必须在代码的许多地方做。

有可能得到工作"如果(int val = rand())"?

这段代码没有意义,但显示了我的问题。

#include <iostream>
#include <cstdlib>
#include <ctime>
bool printIf(int line, bool val)
{
  std::cout << "Line: " << line << std::endl;
  return val;
}
#define IF(x) if( (x) ? printIf(__LINE__, true) : printIf(__LINE__, false) )
int main()
{
  srand(time(NULL));
  //int val;
  //IF (val = rand())
  IF(int val = rand())
  {
    std::cout << "val = " << val << std::endl;
  }
}

编译错误:

$ g++ main.cpp && ./a.out
main.cpp: In function ‘int main()’:
main.cpp:18:6: error: expected primary-expression before ‘int’
   IF(int val = rand())
      ^
main.cpp:11:20: note: in definition of macro ‘IF’
 #define IF(x) if( (x) ? printIf(__LINE__, true) : printIf(__LINE__, false) )
                    ^
main.cpp:18:6: error: expected ‘)’ before ‘int’
   IF(int val = rand())
      ^
main.cpp:11:20: note: in definition of macro ‘IF’
 #define IF(x) if( (x) ? printIf(__LINE__, true) : printIf(__LINE__, false) )
                    ^
main.cpp:22:1: error: expected ‘)’ before ‘}’ token
 }
 ^
main.cpp:22:1: error: expected primary-expression before ‘}’ token

我认为问题在于您在()中包装了变量声明。如果我去掉括号,那么代码编译为:

#include <iostream>
#include <cstdlib>
#include <ctime>
bool printIf(int line, bool val)
{
  std::cout << "Line: " << line << std::endl;
  return val;
}
#define IF(x) if( x ? printIf(__LINE__, true) : printIf(__LINE__, false) )
int main()
{
  srand(time(NULL));
  //int val;
  //IF (val = rand())
  IF(int val = rand())
  {
    std::cout << "val = " << val << std::endl;
  }
}
输出:

Line: 18
val = 1

生活例子