Этот вопрос закрыт для ответов, так как повторяет вопрос Как правильно использовать extern "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)


Я нашел способ через extern "C" {}
Как правильно сделать чтобы можно было запускать С код в С++?))
  • Вопрос задан
  • 213 просмотров
Решения вопроса 1
veydlin
@veydlin
Мне никогда не жалко средств на свое любопытство
Ну, во первых static функции станут приватными и их не будет видно вне файла
Во вторых extern "C" {} надо использовать на хедерах

#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;
}
Ответ написан
Ваш ответ на вопрос

Вопрос закрыт для ответов и комментариев

Потому что уже есть похожий вопрос.
Похожие вопросы