编译的gcc和tcc结构的兼容性 我试图从C++运行LITCC,使用C作为运行时脚本语言。运行时编译的代码必须能够从外部代码运行函数。 当传递int时,这可以正常工作,但是当从tcc代码向gcc代码传递结构时,会发生奇怪的事情

编译的gcc和tcc结构的兼容性 我试图从C++运行LITCC,使用C作为运行时脚本语言。运行时编译的代码必须能够从外部代码运行函数。 当传递int时,这可以正常工作,但是当从tcc代码向gcc代码传递结构时,会发生奇怪的事情,c++,c,gcc,struct,tcc,C++,C,Gcc,Struct,Tcc,最小运行示例: #include <libtcc.h> #include <stdio.h> struct Vec { int x; }; void tmp(struct Vec test) { printf("got %x\n",test.x); } int main() { TCCState* tcc; tcc = tcc_new(); tcc_set_output_type(tcc, TCC_OUTPUT_MEMORY); t

最小运行示例:

#include <libtcc.h>
#include <stdio.h>
struct Vec {
    int x;
};
void tmp(struct Vec test) {
    printf("got %x\n",test.x);
}
int main() {
    TCCState* tcc; tcc = tcc_new();
    tcc_set_output_type(tcc, TCC_OUTPUT_MEMORY);
    tcc_add_symbol(tcc, "tmp", (void*)&tmp);
    tcc_compile_string(tcc, "\
        struct Vec {int x;};\
        void tmp(struct Vec test);\
        void fun() {\
            struct Vec x = {0};\
            tmp(x);\
        }");
    tcc_relocate(tcc, TCC_RELOCATE_AUTO);
    void (*fun)(void) = (void(*)())tcc_get_symbol(tcc, "fun");
    fun();
}
为什么gcc编译版本不打印预期的0? 当我只在结构中放入
long-long
s而不是int时,它就工作了。输出任何其他数据类型和随机数据

起初我认为这是因为对齐或其他原因,但在结构中仅使用单个变量时也会发生这种情况


我使用Linux 3.16 X8664和TCC 0.926

< P>,问题似乎围绕C和C++理解整个“结构VEC测试”作为参数。在TCC中,它被视为指针。在C++中,看起来必须声明它是一个更为清晰的指针。
#include libtcc.h
#include stdio.h
struct Vec {
    int x;
};
void tmp(struct Vec * test) {
    printf("got %x\n",test->x);
}
int main() {
    TCCState* tcc; tcc = tcc_new();
    tcc_set_output_type(tcc, TCC_OUTPUT_MEMORY);
    tcc_add_symbol(tcc, "tmp", (void*)&tmp);
    tcc_compile_string(tcc, "\
        struct Vec {int x;};\
        void tmp(struct Vec test);\
        void fun() {\
            struct Vec x = {5};\
            tmp(x);\
        }");
    tcc_relocate(tcc, TCC_RELOCATE_AUTO);
    void (*fun)(void) = (void(*)())tcc_get_symbol(tcc, "fun");
    fun();
}
输出显示为:

got 5

在来自官方git存储库的新版本tcc(libtcc)中,它按预期工作(打印“got 0”)。在gcc 4.9.3和tcc 0.9.26(commit 00ba4b)上测试。

在哪种体系结构和哪种操作系统上测试?Tinycc在32位x86(又称ia32)上比在64位x86-64(又称amd64)上工作得更好。但“工作得更好”是什么意思?这是64位版本中的一个错误吗?在x86-64上的严重程序上,我从未能够使用
tcc
。在我看来,tinycc在64位上是非常有缺陷的。你也知道这其中的哪一部分是相关的吗?机器代码是否“慢”对我来说并不重要,只要它能按预期工作。C标准不是规定了结构如何工作吗?我的意思是,这些代码都不是C++。谢谢@phiresky:结构是按值传递的。(如果编译器使用指针实现按值传递,只要语义相同即可。)如果带有参数
struct-Vec-test
的函数修改
test
的成员,则该更改不得影响调用者——使用tcc版本0.9.25的快速实验表明tcc获得了正确的结果。(我不知道这一切是怎么回事。)你的代码无法编译;它缺少
指令中的
#include
分隔符。@KeithThompson哦,我想你每天都会学到新东西。TCCState只是从c@phiresky调用tcc库的一种方式:如果tcc假设一个结构参数是指针,那么它将打印
失败
。在我的系统上,gcc 4.8.2和0.9.25都会打印通过的
——这表明这个答案是错误的。查尔斯,我错过什么了吗?
got 5