将结构从 C++ 调用到 C [关闭]

Posted

技术标签:

【中文标题】将结构从 C++ 调用到 C [关闭]【英文标题】:Recall a struct from C++ to C [closed] 【发布时间】:2018-04-25 14:09:20 【问题描述】:

我正在尝试将我在c++ 中编写的程序结构读入c 程序。我用structextern C 为函数创建了一个.h。然后我编写了读取csv file 并将一些元素保存在struct 中的C++ 程序。现在我必须在 C 程序中调用 struct 并读取值,但我遇到了很多问题。我不知道我是否在 .cpp file.h file 或 C 程序中犯了一些错误。我在linux下工作。

我的.h file 是:

typedef struct Buses
 int maggiore;
 int minore;
BusesStruct;

#ifdef __cplusplus
extern "C" 
#endif

    void get_buses(BusesStruct *);

#ifdef __cplusplus

#endif

我的cpp是

#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <algorithm>
#include "lettura.h"
using namespace std;

void get_buses(BusesStruct * bus_scelti)
//leggo il file csv
    string line,nomefile;
    ifstream myfile;
    cout << "Quale file si vuole aprire? " << endl;
    cin >> nomefile;
    myfile.open(nomefile.c_str());
    int j=0;
    if (myfile.is_open()) 
        int primobus;
        int secondobus;
        cout << "Digitare il numero di uno dei due BUS sul quale si vuole eseguire l'operazione (1-9): " << endl;
        cin >> primobus;
        cout << "Digitare il numero di un secondo BUS sul quale si vuole eseguire l'operazione (1-9): " << endl;
        cin >> secondobus;
        int bus1_scelto;
        int bus2_scelto;
        while (getline(myfile,line)) 
            istringstream myline(line);
            string bus[10];
            for (int i=0; i<9; i++)
                    getline(myline,bus[i+1],';');
                

            for (int i=0; i<10; i++)
                if(i == primobus)
                    int bus1_scelto_c = atoi(bus[i].c_str());
                    bus1_scelto=bus1_scelto_c;
                
                if(i == secondobus)
                    int bus2_scelto_c = atoi(bus[i].c_str());
                    bus2_scelto=bus2_scelto_c;
                
            
            bus_scelti[j].maggiore=max(bus1_scelto,bus2_scelto);
            bus_scelti[j].minore=min(bus1_scelto,bus2_scelto);
            j=j+1;          
           
    

在我的 C 文件中,我写了 #include lettura.h 来调用函数:

BusesStruct bus_scelti[10005];
get_buses(bus_scelti);

并定义我的向量并调用函数。 我得到了error

引用未定义到“get_buses”。

你能帮帮我吗?谢谢

【问题讨论】:

你为什么使用extern "C" get_buses() 函数是 C++。 What is the effect of extern "C" in C++? extern "C" void get_buses(BusesStruct * bus_scelti) 也应该在定义中。 你在 cpp 中链接吗? 你是怎么编译的? 所以您没有将 C++ 文件链接到可执行文件中?这就是问题所在。 【参考方案1】:

根据您的评论,这是您的编译方式:

g++ -c lettura.cpp 用于 cpp 文件。对于 c 文件,我使用 g++ complete.c -o complete

这是将 C++ 文件编译为目标文件,然后将 C 文件编译为可执行文件。您还需要在目标文件中进行链接。

几个选项:

g++ -c lettura.cpp                   # compile C++ file to lettura.o
gcc -c complete.c                    # compile C file to complete.o
g++ lettura.o complete.o -o complete # link object files into executable 'complete'

g++ lettura.cpp complete.c -o complete # compile and link in one step

请注意,我使用 gcc 编译 C 代码,使用 g++ 编译 C++ 代码并进行链接。

理想情况下,您应该为此使用 Makefile,但我认为这超出了此问题/答案的范围。

【讨论】:

最好将-Wall -Wextra -g 用于gccg++ 好的,谢谢,我试试 好的,现在它们编译没有错误,但是当我启动 ./COMPLETE 时它会在一段时间后停止。当我回忆这些值时,也许我犯了一个错误。我会搜索错误。谢谢 代码现在可以编译并正常工作。谢谢

以上是关于将结构从 C++ 调用到 C [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

当结构仅在运行时已知时,将结构从 c++ 传递到 c#

从 C++ 如何执行 C 中的方法或访问结构?

如何将结构从 C++ 应用程序传递到 C++ Win32 DLL?

C ++从结构更改为类[关闭]

将包含 int 和 int[] 的结构从 C# 编组到 C++

将带有结构字段的结构从 c++ 返回到 c# pinvoke