Ошибка C2059: синтаксическая ошибка: «строка»

Я просмотрел другие посты и, честно говоря, я до сих пор не уверен, что является причиной проблемы. Я программирую в Visual Studio и

У меня есть следующий код: (это главный C)

int main(int arc, char **argv) {
struct map mac_ip;
char line[MAX_LINE_LEN];

char *arp_cache = (char*) calloc(20, sizeof(char));   //yes i know the size is wrong - to be changed
char *mac_address = (char*) calloc(17, sizeof(char));
char *ip_address = (char*) calloc(15, sizeof(char));

arp_cache = exec("arp -a", arp_cache);

Он использует следующий код cpp:

#include "arp_piping.h"
extern "C" char *exec(char* cmd, char* arp_cache, FILE* pipe) {
pipe = _popen(cmd, "r");
if (!pipe) return "ERROR";
char buffer[128];
while(!feof(pipe)) {
if(fgets(buffer, 128, pipe) != NULL) {
strcat(arp_cache, buffer);
}
}
_pclose(pipe);
return arp_cache;
}

С соответствующим заголовочным файлом:

#ifndef ARP_PIPING_H
#define ARP_PIPING_H
#endif

#ifdef __cplusplus
#define EXTERNC extern "C"#else
#define EXTERNC
#endif

#include <stdio.h>
#include <string.h>

extern "C" char *exec(char* cmd, char* arp_cache, FILE* pipe);

#undef EXTERNC

Но я продолжаю получать следующие ошибки:

1>d:\arp_proto\arp_proto\arp_piping.h(14): error C2059: syntax error : 'string'
1>main.c(22): warning C4013: 'exec' undefined; assuming extern returning int
1>main.c(22): warning C4047: '=' : 'char *' differs in levels of indirection from 'int'

Пожалуйста, могу ли я получить некоторую помощь, я смотрел на другие сообщения, касающиеся c2059, но до сих пор не получается

3

Решение

Измени свой exec декларация об использовании EXTERNC макрос, который вы постарались определить.

EXTERNC char *exec(char* cmd, char* arp_cache, FILE* pipe);
2

Другие решения

Я столкнулся с этой ошибкой компиляции при добавлении enum к проекту. Оказалось, что одно из значений в enum определение имело конфликт имени с препроцессором #define,

enum выглядело примерно так:


// my_header.h

enum Type
{
kUnknown,
kValue1,
kValue2
};

А потом в другом месте был #define со следующим:


// ancient_header.h

#define kUnknown L"Unknown"

Затем в .cpp где-то еще в проекте оба заголовка были включены:


// some_file.cpp

#include "ancient_header.h"#include "my_header.h"
// other code below...


Поскольку имя kUnknown уже #defineкогда компилятор пришел к kUnknown символ в моем enum, он сгенерировал ошибку, так как символ уже использовался для определения строки. Это вызвало загадку syntax error: 'string' что я видел.

Это было невероятно запутанным, поскольку в enum определение и компилируется просто отлично.

Это не помогло, что это было в очень большом проекте C ++, и что #define был транзитивно включен в совершенно отдельный блок компиляции и был написан кем-то 15 лет назад.

Очевидно, что правильная вещь отсюда переименовать это ужасное #define к чему-то менее распространенному, чем kUnknown, но до тех пор, просто переименовав enum значение для чего-то другого работает как фикс, например:


// my_header.h

enum Type
{
kSomeOtherSymbolThatIsntDefined,
kValue1,
kValue2
};

В любом случае, надеюсь, этот ответ будет полезен для кого-то еще, поскольку причина этой ошибки поставила меня в тупик на добрых полтора дня.

1

extern «C» используется для указания компилятору сделать его грамматикой языка Си, но вы имеете в виду объявить внешнюю функцию exec. Вы просто объединяетесь с этим. поэтому переписайте ваш код следующим образом в arp_piping.h:

/*extern "C"*/ char *exec(char* cmd, char* arp_cache, FILE* pipe);

и затем префикс extern «C» в файле cpp.
если вы хотите компилировать их с грамматикой C, просто установите в cpp вызов функции exec, поэтому напишите так:

extern "C" {
#include "arp_piping.h"}
0
По вопросам рекламы [email protected]