menu

arrow_back How to use C++ code together with C?

by
2 votes
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++?)

1 comment

2 Answers

by
 
Best answer
0 votes
Well, first of all, the static functions will become private and they will not be visible outside the file
Second, 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;
}
by
0 votes

1 comment

I tried different variations)) but still writes that the function called from the C header is not defined, although if you make a simple function that just adds and returns a value works, if you write in main.cpp

extern "C"{
#include "название С хэдера"
}
If you don't mind telling me exactly where in my code I need to use extern