Я просмотрел другие посты и, честно говоря, я до сих пор не уверен, что является причиной проблемы. Я программирую в 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, но до сих пор не получается
Измени свой exec
декларация об использовании EXTERNC
макрос, который вы постарались определить.
EXTERNC char *exec(char* cmd, char* arp_cache, FILE* pipe);
Я столкнулся с этой ошибкой компиляции при добавлении 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
};
В любом случае, надеюсь, этот ответ будет полезен для кого-то еще, поскольку причина этой ошибки поставила меня в тупик на добрых полтора дня.
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"}