小编Mic*_*eld的帖子

C程序中整数的历史typedef汤是什么?

这是一个可能无聊的问题,我应该知道它的答案.

十五年前左右,我所看到的很多C代码在平台特定的#ifdefs 中有大量的整数typedef .似乎我看过的每个程序或库都有自己的,互不兼容的typedef汤.我当时并不知道很多关于编程的内容,只是为了告诉编译器你想要使用什么类型的整数,它似乎是一个奇怪的箍.

我已经在脑海中编写了一个故事来解释那些typedef是关于什么的,但我实际上并不知道它是否属实.我的猜测基本上是当C首次开发和标准化时,没有意识到能够平台独立地获得特定大小的整数类型是多么重要,因此所有原始C整数类型可能是不同的不同平台上的尺寸.因此,每个尝试编写可移植C代码的人都必须自己编写代码.

它是否正确?如果是这样,如何程序员预计将使用C整数类型?我的意思是,在一个低级别的语言中,有很多有点麻烦,能说"这是一个32位整数"并不重要吗?自从该语言在1989年被标准化以来,肯定有人认为人们会尝试编写可移植代码吗?

c

48
推荐指数
4
解决办法
3961
查看次数

Haskell类型级文字Nat:状态?

GHC具有类型级字面Nats.我可以阅读一些关于它们的内容,例如:

https://ghc.haskell.org/trac/ghc/wiki/TypeNats

不幸的是,似乎没有关于它们的文档,我尝试用它们几乎没有任何实际工作.

本页的评论18 提到了这个大小参数化Vecs的简单例子(我添加了LANGUAGE编译指示和一个import语句):

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE TypeOperators #-}

import GHC.TypeLits

data Vec :: Nat -> * -> * where
  Nil  :: Vec 0 a
  (:>) :: a -> Vec n a -> Vec (n+1) a

(+++) :: Vec n a -> Vec m a -> Vec (n+m) a
Nil       +++ bs = bs
(a :> as) +++ bs = a :> (as +++ bs)
Run Code Online (Sandbox Code Playgroud)

它当时没有工作,但后来认为实施被修改,以便这起作用.那是5年前......但它不适用于我的GHC 7.10.1: …

haskell dependent-type

17
推荐指数
1
解决办法
792
查看次数

是否可以在Mac OS上调试x64程序集?

我希望能够使用Sierra 10.12.4在我的Mac上编写和调试x64程序集.人们会认为这不是一个特别困难或模糊的愿望,但尽管经过了数小时的努力和大量的在线搜索,我还没有成功,我也没有找到任何其他人.

我更喜欢使用NASM汇编程序,但如果必须,我会使用GAS或任何具有Intel语法的东西.(顺便说一句,请注意gdb和lldb都可以正常使用gcc编译的C文件.)

这是我的情况和我尝试过的:

NASM不起作用

我可以组装和链接文件并验证它是否有效.

$ nasm -f macho64 -g -F dwarf hello2.s -o hello2.o
$ gcc hello2.o -o hello2
$ ./hello2
Hello, world!
Run Code Online (Sandbox Code Playgroud)

但我不能用gdb调试它(注意我确实做了所有必要的代码签名):

$ gdb hello2
GNU gdb (GDB) 8.0
<snip>
Reading symbols from hello2...done.
(gdb) list
1   section .data
2
3   msg: db "Hello, world!", 0
4
5   section .text
6       global _main
7       extern _puts
8
9   _main:
10      push    rbp
(gdb) break 10
Breakpoint 1 at 0x0: file hello2.s, line 10.
(gdb) run
Starting …
Run Code Online (Sandbox Code Playgroud)

debugging macos assembly

10
推荐指数
1
解决办法
1854
查看次数

Haskell/GHC:不安全地解构构造函数?

这是我真正问的一般问题的具体情况:假设我处于性能关键的代码部分并且我收到了一个值

x :: Maybe Int
Run Code Online (Sandbox Code Playgroud)

我知道这是一个Just Int而不是一个Nothing,但由于我的控制代码,我不能安排Int直接接收实际.我想要做

case x of
    Just i -> whatever i
Run Code Online (Sandbox Code Playgroud)

但我不希望GHC插入任何检查或错误处理或跳转或任何东西; 只是将这些位解释为它们的形式Just i并让我处理后果.

这可能吗?(是的,我知道这是不应该经常做的事情.)

performance haskell

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

使用 LLVM 的 C API 的最小示例产生错误:函数和模块具有不同的上下文

我正在尝试使用 C API 实现一个小示例。我收到一条错误消息,指出函数上下文与模块上下文不匹配,我无法弄清楚。

这是我的代码:

#include <stdio.h>

#include <llvm-c/Analysis.h>
#include <llvm-c/Core.h>
#include <llvm-c/Target.h>
#include <llvm-c/TargetMachine.h>

int
main() {
    LLVMInitializeNativeTarget();
    LLVMInitializeNativeAsmPrinter();
    char* triple = LLVMGetDefaultTargetTriple();
    char* error;
    LLVMTargetRef target_ref;
    if (LLVMGetTargetFromTriple(triple, &target_ref, &error)) {
        printf("Error: %s\n", error);
        return 1;
    }
    LLVMTargetMachineRef tm_ref = LLVMCreateTargetMachine(
      target_ref,
      triple,
      "",
      "",
      LLVMCodeGenLevelDefault,
      LLVMRelocStatic,
      LLVMCodeModelJITDefault);
    LLVMDisposeMessage(triple);

    LLVMContextRef context = LLVMContextCreate();
    LLVMModuleRef module = LLVMModuleCreateWithNameInContext("module_name", context);
    // LLVMModuleRef module = LLVMModuleCreateWithName("module_name");

    LLVMTypeRef param_types[] = {LLVMIntType(32), LLVMIntType(32)};
    LLVMTypeRef func_type = LLVMFunctionType(LLVMIntType(32), param_types, 2, 0);

    LLVMValueRef func = …
Run Code Online (Sandbox Code Playgroud)

c llvm

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

标签 统计

c ×2

haskell ×2

assembly ×1

debugging ×1

dependent-type ×1

llvm ×1

macos ×1

performance ×1