V
V
Vladimir A2020-11-02 19:46:42
C++ / C#
Vladimir A, 2020-11-02 19:46:42

How to use C++ code in conjunction with C?

main.cpp

#include "hslocallib.h"


int main(int argc, char *argv[]) {

    const char *inpath = argv[1];
    unsigned int length;

    readInputData(inpath, &length);
    return 0;
}


.h
#ifndef HSLOCAL_INCLUDED
#define HSLOCAL_INCLUDED

#include <stdio.h>
#include <string.h>
#include <limits.h>
#include <hs/hs.h>
#include <errno.h>

 static char *readInputData(const char *inputdata, unsigned int *length);
#endif //HSLOCAL_INCLUDED


.c

#include "hslocallib.h"

static char *readInputData(const char *inputdata, unsigned int *length) {
    FILE *file = fopen(inputdata, "rb");
    if (!file) {
        fprintf(stderr, "Невозможно прочитать файл \"%s\": %s\n", inputdata,
                strerror(errno));
        return NULL;
    }

    if (fseek(file, 0, SEEK_END) != 0) {
        fprintf(stderr, "Невозможно определить конец файла \"%s\": %s\n", inputdata,
                strerror(errno));
        fclose(file);
        return NULL;
    }
    long dataLen = ftell(file);
    if (dataLen < 0) {
        fprintf(stderr, "Невозможно вернуть положение указателя в файле  %s\n", strerror(errno));
        fclose(file);
        return NULL;
    }
    if (fseek(file, 0, SEEK_SET) != 0) {
        fprintf(stderr, "Невозможно найти начало файла \"%s\": %s\n", inputdata,
                strerror(errno));
        fclose(file);
        return NULL;
    }

    char *inputData = malloc(dataLen);
    if (!inputData) {
        fprintf(stderr, "Невозможно выделить память для входных данных\n");
        fclose(file);
        return NULL;
    }

    char *ptrInputData = inputData;
    size_t bytesLeft = dataLen;
    while (bytesLeft) {
        size_t bytesRead = fread(ptrInputData, 1, bytesLeft, file);
        bytesLeft -= bytesRead;
        ptrInputData += bytesRead;
        if (ferror(file) != 0) {
            fprintf(stderr, "Ошибка чтения файла\n");
            free(inputData);
            fclose(file);
            return NULL;
        }
    }
    fclose(file);

    *length = (unsigned int)dataLen;
    return inputData;
}


CMAKE

cmake_minimum_required(VERSION 3.17)

project(hsproject)
set(CMAKE_CXX_STANDARD 17)
add_library(hyperscanlocal STATIC hslocallib.h hslocallib.c)
add_executable(hsproject main.cpp)
target_link_libraries(hsproject hyperscanlocal)


I found a way through extern "C" {}
What is the right way to make it possible to run C code in C ++?))

Answer the question

In order to leave comments, you need to log in

2 answer(s)
V
veydlin, 2020-11-03
@hauptling

Well, firstly, static functions will become private and will not be visible outside the file
. Secondly, extern "C" {} should be used on headers

#ifndef HSLOCAL_INCLUDED
#define HSLOCAL_INCLUDED

#include <stdio.h>
#include <string.h>
#include <limits.h>
#include <hs/hs.h>
#include <errno.h>
extern "C" {
 char *readInputData(const char *inputdata, unsigned int *length);
}
#endif //HSLOCAL_INCLUDED

#include "hslocallib.h"

char *readInputData(const char *inputdata, unsigned int *length) {
    FILE *file = fopen(inputdata, "rb");
    if (!file) {
        fprintf(stderr, "Невозможно прочитать файл \"%s\": %s\n", inputdata,
                strerror(errno));
        return NULL;
    }

    if (fseek(file, 0, SEEK_END) != 0) {
        fprintf(stderr, "Невозможно определить конец файла \"%s\": %s\n", inputdata,
                strerror(errno));
        fclose(file);
        return NULL;
    }
    long dataLen = ftell(file);
    if (dataLen < 0) {
        fprintf(stderr, "Невозможно вернуть положение указателя в файле  %s\n", strerror(errno));
        fclose(file);
        return NULL;
    }
    if (fseek(file, 0, SEEK_SET) != 0) {
        fprintf(stderr, "Невозможно найти начало файла \"%s\": %s\n", inputdata,
                strerror(errno));
        fclose(file);
        return NULL;
    }

    char *inputData = malloc(dataLen);
    if (!inputData) {
        fprintf(stderr, "Невозможно выделить память для входных данных\n");
        fclose(file);
        return NULL;
    }

    char *ptrInputData = inputData;
    size_t bytesLeft = dataLen;
    while (bytesLeft) {
        size_t bytesRead = fread(ptrInputData, 1, bytesLeft, file);
        bytesLeft -= bytesRead;
        ptrInputData += bytesRead;
        if (ferror(file) != 0) {
            fprintf(stderr, "Ошибка чтения файла\n");
            free(inputData);
            fclose(file);
            return NULL;
        }
    }
    fclose(file);

    *length = (unsigned int)dataLen;
    return inputData;
}

F
Filin Filin, 2020-11-02
@JSFilin

microsin.net/programming/pc/faq-how-to-mix-c-and-c...

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question