错误C2059:语法错误:'string'

时间:2013-07-19 08:19:45

标签: c++ c visual-studio-2010 error-handling

我看过其他帖子,说实话我仍然不确定导致问题的原因。我在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的其他帖子,但我仍然无处可去

3 个答案:

答案 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"
}