Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.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,我知道我想开枪打自己的腿;)但是,它将允许我使其余(大量)代码更小、更可读 在另一个预处理器宏中创建预处理器宏是否有任何棘手的方法 这就是我要找的例子。我的真实情况更复杂 // That's what I want to do and surely C++ doesn't like it. #define MACROCREATER(B) #define MACRO##B B+B void foo() { MACROCREATOR(5) // This should create new ma

我知道我想开枪打自己的腿;)但是,它将允许我使其余(大量)代码更小、更可读

在另一个预处理器宏中创建预处理器宏是否有任何棘手的方法

这就是我要找的例子。我的真实情况更复杂

// That's what I want to do and surely C++ doesn't like it.
#define MACROCREATER(B) #define MACRO##B B+B

void foo()
{
 MACROCREATOR(5) // This should create new macro (#define MACRO5 5+5)

 int a = MACRO5; // this will use new macro
}

否。即使宏扩展为类似于预处理指令的内容,扩展也不会作为预处理指令进行计算。

否。即使宏扩展为类似于预处理指令的内容,扩展也不会作为预处理指令进行计算。

否。预处理器是单通道的。它不会重新计算宏扩展。

否。预处理器是单通道的。它没有重新评估宏扩展。

< P> C++标准称(16.3.4.3):

结果完全 宏替换的预处理令牌 序列[…宏展开…]未作为 预处理指令,即使它 像一个

不,没有“官方”的方式来实现你想要的宏。

< P> C++标准说:(16.3.4.3):

结果完全 宏替换的预处理令牌 序列[…宏展开…]未作为 预处理指令,即使它 像一个

因此,没有任何“官方”方法可以实现宏所需的功能。

如前所述,可以在不同宏定义处于活动状态的情况下多次包含特定文件。这可以实现一些通过任何其他手段都无法实际实现的效果

作为一个简单的例子,在许多嵌入式系统上,指针间接寻址与直接变量访问相比非常昂贵。使用大量指针间接寻址的代码可能是仅使用变量的代码的两倍大且速度慢。因此,如果一个特定的例程与两组变量一起使用,在一种情况下,通常会传入指向结构的指针,然后使用箭头运算符,那么将例程简单地放入它自己的文件(我通常使用扩展名.I)可能会更有效,该文件只包含一次,而没有定义宏PASS2,第二次是和你在一起。然后,该文件可以#ifdef _PASS2/#else为两个过程中应该不同的所有变量定义宏。尽管代码生成了两次,但在某些micro上,它比使用带有传入指针的箭头运算符占用的空间要小。

如前所述,可以多次包含具有不同宏定义的特定文件。这可以实现一些通过任何其他手段都无法实际实现的效果


作为一个简单的例子,在许多嵌入式系统上,指针间接寻址与直接变量访问相比非常昂贵。使用大量指针间接寻址的代码可能是仅使用变量的代码的两倍大且速度慢。因此,如果一个特定的例程与两组变量一起使用,在一种情况下,通常会传入指向结构的指针,然后使用箭头运算符,那么将例程简单地放入它自己的文件(我通常使用扩展名.I)可能会更有效,该文件只包含一次,而没有定义宏PASS2,第二次是和你在一起。然后,该文件可以#ifdef _PASS2/#else为两个过程中应该不同的所有变量定义宏。尽管代码生成了两次,但在某些微型计算机上,它比使用带有传入指针的箭头运算符占用的空间要小。

请看m4。它类似于cpp,但递归性更强。我使用m4为汇编程序创建了一种结构化语言,例如

  cmp r0, #0
  if(eq)
    mov r1, #0
  else
    add r1, #1
  end

“if”、“else”和“end”是对我编写的m4宏的调用,它们生成跳转和标签,其余的是本机程序集。为了嵌套这些if/else/end构造,您需要在宏中定义。它类似于cpp,但递归性更强。我使用m4为汇编程序创建了一种结构化语言,例如

  cmp r0, #0
  if(eq)
    mov r1, #0
  else
    add r1, #1
  end

“if”、“else”和“end”是对我编写的m4宏的调用,它们生成跳转和标签,其余的是本机程序集。为了嵌套这些if/else/end构造,您需要在宏中进行定义。

作为上述答案的补充,如果您真的想预处理源文件两次,而这几乎肯定不是您真正想要做的,您可以像这样调用编译器:

g++ -E input.cpp | g++ -c -x c++ - -o output.o
也就是说,通过预处理器运行文件,然后通过管道通过完整的编译例程运行预处理的输出,包括第二个预处理步骤。为了让它有一个相当好的工作机会,我想您必须非常小心地定义和使用宏,总之,它很可能不值得费心和增加构建时间

如果确实需要宏,请使用基于宏的标准解决方案。如果您确实想要编译时元编程,请使用模板


稍微相关的一点是,这让我想起了光线跟踪语言POV-Ray大量使用了相当复杂的预处理语言,以及允许条件重复、编译时计算和其他类似功能的流控制指令,如
#while
。它是C++中的,但它不是,所以我们只是用另一种方式做。

< P>作为上面答案的补充,如果你真的想预处理一个源文件两次,这肯定不是你真正想要做的,你可以总是这样调用你的编译器:

g++ -E input.cpp | g++ -c -x c++ - -o output.o
也就是说,通过预处理器运行文件,然后通过管道通过完整的编译例程运行预处理的输出,包括第二个预处理步骤。为了让它有一个相当好的工作机会,我