我看过其他帖子,说实话我仍然不确定导致问题的原因。我在Visual Studio中编程和
我有以下代码:(这是一个C main)
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的其他帖子,但我仍然无处可去
答案 0 :(得分:2)
更改您的exec
声明,以使用您需要定义的EXTERNC
宏。
EXTERNC char *exec(char* cmd, char* arp_cache, FILE* pipe);
答案 1 :(得分:1)
在向项目添加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
&#39; d,当编译器来到我的kUnknown
中的enum
符号时,它会生成错误,因为符号已用于定义字符串。这引起了我所看到的神秘syntax error: 'string'
。
这令人难以置信的混乱,因为enum
定义中的所有内容似乎都是正确的,并且可以自行编译。
这在一个非常大的C ++项目中没有帮助,并且#define
被传递地包含在一个完全独立的编译单元中,并且是15年前由某人编写的。
显然,从这里做正确的事情就是将那个可怕的#define
重命名为kUnknown
以下的常见内容,但在此之前,只需将enum
值重命名为其他内容即可修复,例如:
// my_header.h
enum Type
{
kSomeOtherSymbolThatIsntDefined,
kValue1,
kValue2
};
无论如何,希望这个答案对其他人有帮助,因为这个错误的原因使我度过了一整天。
答案 2 :(得分:0)
extern“C”用于告诉编译器将其设为C语法,但你的意思是去掉一个名为exec的extern函数。你只是融合了不同的东西。所以在arp_piping.h中重写你的代码:
/*extern "C"*/ char *exec(char* cmd, char* arp_cache, FILE* pipe);
然后在cpp文件中删除extern“C”的前缀。 如果你想用C语法编译它们,只需在调用函数exec的cpp中设置,所以这样写:
extern "C" {
#include "arp_piping.h"
}