我从未明白ABI是什么.请不要指向维基百科的文章.如果我能理解它,我就不会在这里张贴这么长的帖子.
这是我对不同界面的看法:
电视遥控器是用户和电视之间的接口.它是一个现有实体,但本身无用(不提供任何功能).遥控器上每个按钮的所有功能都在电视机中实现.
接口:它是间"现有实体"层
functionality和consumer的该功能.接口本身不起作用.它只是调用后面的功能.现在取决于用户是谁,有不同类型的接口.
命令行界面(CLI)命令是现有实体,消费者是用户和功能所在.
functionality:我的软件功能解决了我们描述这个界面的一些目的.
existing entities:命令
consumer:用户图形用户界面(GUI)窗口,按钮等是现有实体,消费者再次是用户和功能所在.
functionality:我的软件功能解决了我们描述这个界面的一些问题.
existing entities:窗口,按钮等..
consumer:用户应用程序编程接口(API)函数(或更正确的)接口(在基于接口的编程中)是现有实体,这里的消费者是另一个程序而不是用户,并且该层后面的功能也是如此.
functionality:我的软件功能解决了我们描述这个界面的一些问题.
existing entities:函数,接口(函数数组).
consumer:另一个程序/应用程序应用程序二进制接口(ABI)这是我的问题开始的地方.
functionality:???
existing entities:???
consumer:???
ABI涵盖了诸如此类的详细信息
- 数据类型,大小和对齐方式;
- 调用约定,它控制函数参数的传递方式并返回检索的值;
- 系统调用号码以及应用程序应如何向操作系统进行系统调用;
其他ABI标准化细节,如
- C++名称错误,
- 异常传播,和
- 在同一平台上调用编译器之间的约定,但不需要跨平台兼容性.
谁需要这些细节?请不要说操作系统.我知道汇编编程.我知道链接和加载是如何工作的.我确切地知道里面发生了什么.
为什么C++名称输入?我以为我们正在谈二进制.语言为什么会进来?
无论如何,我已经下载了[PDF] System V Application Binary Interface Edition 4.1(1997-03-18),看看它究竟包含了什么.好吧,大部分都没有任何意义.
为什么它包含两章(第4和第5章)来描述ELF文件格式?实际上,这些是该规范中仅有的两个重要章节.其余章节是"处理器特定的".无论如何,我认为这是一个完全不同的话题.请不要说ELF文件格式规范是 ABI.根据定义,它不符合接口的条件.
我知道,因为我们谈论的水平很低,所以必须非常具体.但我不确定它是如何"指令集架构(ISA)"具体的?
我在哪里可以找到Microsoft Windows的ABI?
所以,这些是困扰我的主要问题.
我正在阅读"用C++思考",它刚刚介绍了这个extern声明.例如:
extern int x;
extern float y;
Run Code Online (Sandbox Code Playgroud)
我想我理解了意义(没有定义的声明),但我想知道什么时候它有用.
有人能提供一个例子吗?
为什么我们需要使用:
extern "C" {
#include <foo.h>
}
Run Code Online (Sandbox Code Playgroud)
特别:
我们什么时候应该使用它?
在编译器/链接器级别发生了什么,需要我们使用它?
如何在编译/链接方面解决了需要我们使用它的问题?
我最近接受了一次采访,问了一个问题是extern "C"C++代码的用法是什么.我回答说它是在C++代码中使用C函数,因为C不使用名称修改.我被问到为什么C不使用名称错误,说实话我无法回答.
我知道当C++编译器编译函数时,它为函数提供了一个特殊的名称,主要是因为我们可以在C++中使用同名的重载函数,这些函数必须在编译时解析.在C中,函数的名称将保持不变,或者在它之前使用_.
我的疑问是:允许C++编译器破坏C函数有什么问题?我原以为编译器给它们的名称无关紧要.我们在C和C++中以相同的方式调用函数.
有没有办法从Swift调用C例程?
很多iOS/Apple库只是C,我仍然希望能够调用它们.
例如,我希望能够从swift调用objc运行时库.
特别是,如何桥接iOS C标头?
我一直在想.我知道编译器会将您编写的代码转换为二进制文件,但链接器的作用是什么?对我来说,它们一直是个谜.
我粗略地理解'链接'是什么.当对库和框架的引用添加到二进制文件时.除此之外我什么都不懂.对我来说它"只是有效".我也理解动态链接的基础知识,但没有太深入.
有人可以解释这些条款吗?
有没有办法在每次调用某个函数时在C或C++中正在运行的进程中转储调用堆栈?我的想法是这样的:
void foo()
{
print_stack_trace();
// foo's body
return
}
Run Code Online (Sandbox Code Playgroud)
其中的print_stack_trace工作方式类似于callerPerl.
或类似的东西:
int main (void)
{
// will print out debug info every time foo() is called
register_stack_trace_function(foo);
// etc...
}
Run Code Online (Sandbox Code Playgroud)
在哪里register_stack_trace_function放置某种内部断点,这将导致在调用时打印堆栈跟踪foo.
在某些标准C库中是否存在这样的事情?
我正在使用GCC在Linux上工作.
我有一个测试运行,基于一些不应该影响此行为的命令行开关,行为不同.我的代码有一个伪随机数生成器,我假设它是基于这些开关被不同地调用的.我希望能够使用每组开关运行测试,并查看随机数生成器是否针对每个开关进行不同的调用.
我的任务是将ac包"包装"到python类中.在这个问题上,文档非常模糊.似乎他们期望只有高级python用户才能实现ctypes.好吧,我是python的初学者,需要帮助.
一步一步的帮助将是美好的.
所以我有我的c库.我该怎么办?我把哪些文件放在哪里?如何导入库?我读到可能有一种方法可以"自动换行"到Python?
(顺便说一句,我在python.net上做了ctypes教程,但它不起作用.意思是我认为他们假设我应该能够完成剩下的步骤.
实际上这是我用他们的代码得到的错误:
File "importtest.py", line 1
>>> from ctypes import *
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)
我真的可以一步一步地帮助这个!谢谢〜
只是一个简单的程序,但我一直得到这个编译错误.我正在使用MinGW作为编译器.
这是头文件,point.h:
//type for a Cartesian point
typedef struct {
double x;
double y;
} Point;
Point create(double x, double y);
Point midpoint(Point p, Point q);
Run Code Online (Sandbox Code Playgroud)
这是重点.:
//This is the implementation of the point type
#include "point.h"
int main() {
return 0;
}
Point create(double x, double y) {
Point p;
p.x = x;
p.y = y;
return p;
}
Point midpoint(Point p, Point q) {
Point mid;
mid.x = (p.x + q.x) / 2;
mid.y …Run Code Online (Sandbox Code Playgroud)