Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.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++;(g+;+;)构造函数以什么顺序获取? < >我想调用另一种语言的C++构造函数,需要知道给出它的参数。我认为应该是声明的参数和“this”指针。但是在GNUG++中,“this”指针是第一个还是最后一个?除了“this”指针,还有其他隐藏参数吗_C++_Constructor_Calling Convention_Abi - Fatal编程技术网 我想调用另一种语言的C++构造函数,需要知道给出它的参数。我认为应该是声明的参数和“this”指针。但是在GNUG++中,“this”指针是第一个还是最后一个?除了“this”指针,还有其他隐藏参数吗,c++,constructor,calling-convention,abi,C++,Constructor,Calling Convention,Abi" /> 我想调用另一种语言的C++构造函数,需要知道给出它的参数。我认为应该是声明的参数和“this”指针。但是在GNUG++中,“this”指针是第一个还是最后一个?除了“this”指针,还有其他隐藏参数吗,c++,constructor,calling-convention,abi,C++,Constructor,Calling Convention,Abi" />

除了陈述的论点和;这";指针,c++;(g+;+;)构造函数以什么顺序获取? < >我想调用另一种语言的C++构造函数,需要知道给出它的参数。我认为应该是声明的参数和“this”指针。但是在GNUG++中,“this”指针是第一个还是最后一个?除了“this”指针,还有其他隐藏参数吗

除了陈述的论点和;这";指针,c++;(g+;+;)构造函数以什么顺序获取? < >我想调用另一种语言的C++构造函数,需要知道给出它的参数。我认为应该是声明的参数和“this”指针。但是在GNUG++中,“this”指针是第一个还是最后一个?除了“this”指针,还有其他隐藏参数吗,c++,constructor,calling-convention,abi,C++,Constructor,Calling Convention,Abi,由于我已经解决了这些问题,所以这个问题不涉及其他问题,如名称损坏。这个问题只是关于构造函数的参数。我使用的特定语言也不是问题,因为它是一种正在开发的语言,这个问题通常适用于非C++语言,而不仅仅是特定的语言 编辑添加:这是针对使用G++约定的英特尔CPU。这应该可以回答ABI所涉及的问题 对于“外部C”,这不是C++代码。它调用C++代码,但由于它不是C++代码本身,所以使用“ExtEng+C”将是毫无意义的。此外,它调用的C++代码必须按原样使用,而不必添加“外部C”之类的东西。 我要找的不是

由于我已经解决了这些问题,所以这个问题不涉及其他问题,如名称损坏。这个问题只是关于构造函数的参数。我使用的特定语言也不是问题,因为它是一种正在开发的语言,这个问题通常适用于非C++语言,而不仅仅是特定的语言

编辑添加:这是针对使用G++约定的英特尔CPU。这应该可以回答ABI所涉及的问题

对于“外部C”,这不是C++代码。它调用C++代码,但由于它不是C++代码本身,所以使用“ExtEng+C”将是毫无意义的。此外,它调用的C++代码必须按原样使用,而不必添加“外部C”之类的东西。


我要找的不是呼叫约定的精确正式定义。我只是想要一些线索来做实验。例如,C++编译器将“这个”指针放在第一个参数以外的位置有多普遍?除了“this”指针之外,还有其他隐藏参数的情况有多普遍。如果“这个”指针不是第一个,它几乎总是最后一个,还是有时在中间?等等。

参数列表中此指针的位置由实现定义。如果要与其他语言交互,请添加C包装器:

// Your class
struct MyClass {
    MyClass(int, int);
    void doSomething(char,int);
};
// C wrapper
void* construct_MyClass(int a, int b) {
    return new MyClass(a, b);
}
void doSomething(void* thisPtr, char c, int a) {
    static_cast<MyClass*>(thisPtr)->doSomething(c, a);
}
//您的类
结构MyClass{
MyClass(int,int);
无效剂量测量(字符,整数);
};
//C包装
void*construct_MyClass(int a,int b){
返回新的MyClass(a、b);
}
无效剂量测量(无效*此PTR,字符c,整数a){
静态浇铸(thisPtr)->剂量测定(c,a);
}

这样,编译器将负责按预期顺序放置参数,让调用方代码与C API交互。您需要在C函数的声明中保留C链接的名称。

此指针在参数列表中的位置由实现定义。如果要与其他语言交互,请添加C包装器:

// Your class
struct MyClass {
    MyClass(int, int);
    void doSomething(char,int);
};
// C wrapper
void* construct_MyClass(int a, int b) {
    return new MyClass(a, b);
}
void doSomething(void* thisPtr, char c, int a) {
    static_cast<MyClass*>(thisPtr)->doSomething(c, a);
}
//您的类
结构MyClass{
MyClass(int,int);
无效剂量测量(字符,整数);
};
//C包装
void*construct_MyClass(int a,int b){
返回新的MyClass(a、b);
}
无效剂量测量(无效*此PTR,字符c,整数a){
静态浇铸(thisPtr)->剂量测定(c,a);
}

这样,编译器将负责按预期顺序放置参数,让调用方代码与C API交互。您需要在C函数的声明中保留C链接的名称。

< P> C++标准没有定义如何将< <代码> < < /C> >指针和任何参数传递给构造函数(或任何函数)。这是ABI(应用程序二进制接口)的工作,不同的编译器可以使用不同的ABI,在现实世界中也是如此。ABI不是C++标准的一部分。 我将假设您想要使用的两种语言都是使用编译器编译成机器代码的,因为这使讨论更容易。类似的原则适用于口译和其他语言,但具体细节不同

一般来说,为了正确地调用任何一个C++函数,两种语言都必须被各自的语言编译器翻译成相同的ABI,或者必须有一个定义的/文件化的方法,用两个不同的ABI互操作。换句话说,编译器和它们生成的机器代码都必须设计为互操作


实际上,C++标准指定了它如何在语言层与C交互。C不能使用所有C++构造,但是 Extn“C”<代码>函数由C++编译器构建,允许C++调用C兼容编译器和C++编译器,或者它们发出的代码可以互操作,假设编译器支持相同的ABI。例如,G++(GNU的C++编译器前端)和GCC(GNU的C编译器前端)被设计为互操作,但它们不一定(必须)与来自其他供应商的编译器互操作。从技术上讲,gnu C编译器输出的机器代码可能与另一个供应商的C编译器输出的代码进行互操作,但要做到这一点,需要非常详细地了解两个编译器所支持的ABI是如何工作的(以及两个供应商的有意支持)


对于其他语言与C++进行互操作,选项不太直接。通常,共同的分母是C语言,其他语言提供了与C互操作的工具,C++也一样,因此,一些C接口用作两者之间的中介。例如,C++中实例化对象的代码可以放在<代码>外部“C”< /代码>函数中。然后,代码可以用C++编译器编译,并且得到的函数有一个接口,允许从C代码调用它。如果另一种语言(或编译器)支持C的互操作(即,为了正确地调用C函数,就可以正确地满足接口要求),那么C函数可以从其他语言调用。

< P> C++没有定义如何将<代码> < < /C> >指针和任何参数传递给构造函数。这是ABI(应用程序二进制接口)的工作,不同的编译器可以在现实世界中使用不同的ABI,ABI不是C++标准的一部分。 我将假设您想要使用的两种语言都是使用编译器编译成机器代码的,因为这使讨论变得容易