【问题标题】:C++ "Compiler" with preprocessor [closed]带有预处理器的 C++“编译器”[关闭]
【发布时间】:2016-11-27 22:28:33
【问题描述】:

所以我们有一个分配,我们在其中创建类似伪语言的编译器。

例子:

PROGRAM_BEGIN
...             //code
VAR(name) = NUMBER(2.3)
PROGRAM_END

我们必须用预处理器来处理这个问题,然后把它变成 c++ 代码。

例子:

#define PROGRAM_BEGIN int main(){
#define PROGRAM_END return 1;}

我遇到的问题是我们必须支持如下代码:

VAR(name) = NUMBER(1)+NUMBER(2.5)  

经过深思熟虑,我有几个想法,但到目前为止没有任何效果(例如,使用具有动态创建名称的变量)。我想通过一些适当的数据处理,我已经计划将输入组织到类中,使用运算符重载可以帮助完成这项工作,但我仍然看不到大局。

【问题讨论】:

  • 您能具体说明您的要求吗?如果您正在寻找一种使用预处理器表达VAR(name) 的方法,您应该查看预处理器宏。在这种情况下,#define VAR(name) int name 应该可以解决问题。实际上int 在这里做得不好。我想使用浮点并进行隐式转换或使用联合将是一种方式。但是没有实际需求就说不准了。
  • 是的,我已经这样做了,但是如果你这样做,NUMBER(22) + NUMBER(11) 将变为 int x = 22; + 整数 x = 11;这不会运行...
  • 12.5 已经是一个数字,所以 NUMBER 宏不需要做任何其他事情
  • 你可以在VAR中使用auto
  • #define VAR(name) int name#define NUMBER(number) number 如果你这样做 VAR(x) = NUMBER(1) + NUMBER(3),预处理器将转换为 int x = 1 + 3

标签: c++ c-preprocessor


【解决方案1】:

试试这个(cout 仅用于调试):

#include <iostream>
using namespace std;

#define PROGRAM_BEGIN   int main(){
#define PROGRAM_END     return 1;}
#define VAR(x)          auto x
#define NUMBER(x)       x

PROGRAM_BEGIN
VAR(name) = NUMBER(1) + NUMBER(2.5);
cout << name << endl;
PROGRAM_END

通过使用auto,您无需担心VARint 还是float

【讨论】:

  • 谢谢,您的回答让我明白,我插入#define VAR(ID) 的代码应该放在自动ID 之前,否则无法编译
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-12
  • 2013-12-15
相关资源
最近更新 更多