小编dmc*_*kee的帖子

编译器编程:最基本的成分是什么?

我有兴趣编写一个非常简约的编译器.

我想写一小段软件(用C/C++),它符合以下标准:

  • ELF格式的输出(*nix)
  • input是单个文本文件
  • 类C语法和语法
  • 没有链接器
  • 没有预处理器
  • 非常小(最大1-2 KLOC)

语言特色:

  • 本机数据类型:char,int和float
  • 数组(适用于所有本机数据类型)
  • 变量
  • 控制结构(if-else)
  • 功能
  • 循环(会很好)
  • 简单代数(div,add,sub,mul,布尔表达式,位移等)
  • 内联asm(用于系统调用)

谁能告诉我怎么开始?我不知道编译器包含哪些部分(至少在某种意义上我不能直接启动)以及如何对它们进行编程.谢谢你的想法.

c c++ compiler-construction low-level

6
推荐指数
2
解决办法
833
查看次数

使用makefile目标来设置构建选项

这要么是微不足道的,要么与make应该如何使用的哲学背道而驰,但是我希望有一个命令行,它读作"make debug"而不是"make DEBUG = 1".我尝试创建一个名为debug的虚假目标,除了设置DEBUG变量之外什么也没做,但是"make debug build"和"make build debug"之间存在差异 - 即在一种情况下,变量在构建之后设置了发生了.

有没有办法给某些目标优先权?

谢谢你的帮助.

makefile

6
推荐指数
2
解决办法
7441
查看次数

你如何在矩阵中交换两行(在C中)?

例如,给定一个矩阵:

1 2 3

4 5 6

7 8 9

如果你是goint交换行[0]和行[1],结果矩阵将是:

4 5 6

1 2 3

7 8 9

你能帮助我在C中获取代码吗?

c swap row matrix

6
推荐指数
2
解决办法
4万
查看次数

在python中将这些字节转换为int的最短方法?

我正在将以下字符串转换为无符号整数表示:

str = '\x00\x00\x00\x00\x00\x00\x01\xFF'

我可以struct.unpack('8B', str)用来获取元组表示(0,0,0,0,0,0,1,255),但是将这个元组转换为int的最快/最简单的方法是什么?

现在,我的代码是

def unpack_str(s):
  i = r = 0
  for b in reversed(struct.unpack('8B', s)):
    r += r*2**i
    i++
  return r
Run Code Online (Sandbox Code Playgroud)

但这很长很丑,对于这么简单的功能!肯定有更好的办法!任何SO python大师都可以帮我修剪它和python-ify吗?

python

6
推荐指数
1
解决办法
7792
查看次数

让asprintf使用也是输入的非NULL目标指针是否安全?

tl; dr可以asprintf天真地用于连接而无需调用临时指针?


asprintfGNU引入并在其他几个clib实现中采用的函数是使用类似方案在c中进行任意连接的诱人解决方案

int i=0;
char *str = strdup(argv[i]);
while (argv[++i]) {
   asprintf(&str,"%s %s",argv[i],str);   // <=== This line
}
asprintf(&str,"%s\n",str);
Run Code Online (Sandbox Code Playgroud)

当包裹在主要和必要的包含,这对我来说运行良好.

但...

是否在整个地方泄漏记忆?Valgrind说它在我的盒子上.这是一个错误吗?

我面前的那个人页说

asprintf()和vasprintf()函数将*ret设置为指向缓冲区的指针,该缓冲区足以容纳格式化的字符串.应该将此指针传递给free(3)以在不再需要时释放已分配的存储.如果无法分配足够的空间,asprintf()和vasprintf()将返回-1并将ret设置为NULL指针.

在这句话中由于缺少"设置*ret为指向一个新的缓冲[...]",我很想假设函数使用reallocgetline一样.

可能有什么问题?

使用签名int asprintf(char **ret, const char *format, ...);具体.

  1. asprintf跑得太快realloc了.

    想象一下,我们实现了这个函数,我们可以realloc(*ret)在它取消引用其中一个混淆原始缓冲区的变量之前运行.该缓冲区已被释放,这在技术上是未定义的行为.这将代表一个错误.

  2. asprintf在读取之前写入缓冲区.在上面的代码就可以成像功能拷贝的内容argv[1]*ret之前的每va_argstr参数.我引用的联机帮助页似乎并不排除这种情况.

  3. asprintffree *ret直接或通过使用realloc.这将避免问题编号(1),但如果如上所述使用会泄漏内存.再一次,该手册页似乎不排除它.

解决

通过将单个调用替换为asprintfwith,可以避免上述所有操作

{
  char …
Run Code Online (Sandbox Code Playgroud)

c alias stdio

6
推荐指数
1
解决办法
1299
查看次数

为什么std :: stream操纵器基础结构中类型不一致?

今天要做一点流输出,并且需要强制格式化字段。回顾大多数操纵器都是持久性的,我决定向恶作剧者投保:

auto oldp = std::cout.precision(); // Cache this to be able to undo a set
std::out << "threshold" 
         << std::setprecision(2) << m_threshold   // set 
         << std::setprecision(oldp) << std::endl; // restore 
Run Code Online (Sandbox Code Playgroud)

我的linter在“恢复”行上引发了有关隐式整数向下转换的警告。

稍微四处张望,'sure'nuf,std::setprecision需要int,而std::ios_base::precision返回streamsize(这long在我前面的系统上是一个)。

因此,短绒猫正在提出有效的申诉(而且很容易就可以解决),但是为什么这种情况仍然存在?

c++ types iostream c++-standard-library

6
推荐指数
0
解决办法
39
查看次数

Easy C enum问题

我刚刚开始使用C语言,并且我被要求回答一些编码练习,其中出现以下代码:

typedef enum {
  false = 0,
  true = 1
} Bool;
Run Code Online (Sandbox Code Playgroud)

有人可以提供一个简短而明确的解释吗?

非常感谢.

c enums

5
推荐指数
1
解决办法
2万
查看次数

O(2 ^ N)算法的示例

我被告知过

O(2 ^ N)表示一种算法,其增长将随输入数据集中的每个附加元素加倍

有人能提供一个像这样的例子吗?

java algorithm

5
推荐指数
1
解决办法
1万
查看次数

关于使用scala的模块方法进行游戏的说明

我正在寻找新项目的各种Web框架(社交网络+连接用户之间的交易).我对Play(使用scala)很感兴趣,但在理解问题时需要一些帮助.

在Play中,核心不支持CDN +缩小,但是通过单独的模块greenscript.但是使用此模块需要使用基于绿色标记的新标记替换布局中的系统标记.这与Rails不同,在Rails中,您不必向布局添加任何内容,也可以通过附加act_as_*标记来使用新插件来逃避.有关长期Play方法是否让插件接管覆盖标记的任何想法?在这种情况下,如果你想在同一个对象上运行几个模块,比如一个url,那么它可以在Play中运行吗?

关于在Play中实现此目的的替代方法的任何指导也会有所帮助.

scala module cdn playframework

5
推荐指数
1
解决办法
139
查看次数

指向函数的指针的语法,该函数返回C中的函数指针

如何声明一个返回另一个函数指针的函数的指针?请与我分享语法和示例代码段.

另外,在哪种情况下会使用返回函数指针的函数指针?

c syntax declaration

5
推荐指数
2
解决办法
2212
查看次数