2013-07-19 166 views
3

我看了其他帖子,说实话我仍然不确定是什么原因造成的问题。我编程在Visual Studio和错误C2059:语法错误:'字符串'

我有以下代码:(这是一个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其他职位,但我仍然一事无成

+0

'#包括'@GrijeshChauhan我使用视觉工作室失踪 –

+0

,我们没有这样的头文件 – cxzp

+0

如果定义了'EXTERNC'宏C++,你为什么不使用它呢?此外,如果'#ifndef ARP_PIPING_H'应该是一个包含守护进程,'#endif'需要位于头部的末尾。现在,您可以防止“ARP_PIPING_H”的双重定义,但这不起任何作用 – user2573221

回答

2

更改您的exec声明使用EXTERNC宏观你已经不厌其烦地定义。

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

我不是Windows程序员,但没有得到什么是'EXTERNC',这是什么? –

+1

@GrijeshChauhan'EXTERNC'在这里解析为'extern“C”',这使得函数名具有C链接,所以它可以在C程序中使用。这不是Windows特定的功能!在这里阅读更多:http://stackoverflow.com/questions/1041866/in-c-source-what-is-the-effect-of-extern-c – user2573221

+0

@GrijeshChauhan:'EXTERNC'扩展为'extern“C”'当使用C++编译器进行编译时,其他情况不会扩展。因此,C代码会看到一个常规的函数声明,而C++则会看到一个特殊的声明,指明该声明是针对具有C链接的符号的(也就是说,在尝试解析符号时不要改变名称)。 – jxh

0

extern“C”用于告诉编译器使它成为C语言,但你的意思是释放一个名为exec的外部函数。你只是融合了这个不同。所以在arp_piping.h中像这样重写代码:

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

然后在cpp文件中删除extern“C”的preffix。 如果你想使用C语法来comiler他们,只是在呼吁函数EXEC CPP的设置,所以这样写:

extern "C" { 
    #include "arp_piping.h" 
} 
+0

'extern“C”用于告诉编译器使其成为C语法'不,它不是。它是关于调用约定的,就是这样。 –

+0

调用约定的含义是什么?你能解释一下吗?谢谢你的提示首先 – DarkHorse

0

我加入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'd,当编译器来到我的enum中的kUnknown符号时,由于该符号已被用于定义字符串,所以它产生了一个错误。这导致我看到的神秘的syntax error: 'string'

这是令人难以置信的混淆,因为在enum定义中所有内容看起来都是正确的,并且它自己编译得很好。

这并没有帮助这是一个非常大的C++项目,并且#define被过渡性地包含在一个完全独立的编译单元中,并且是15年前某人写的。

显然,从这里到做正确的事情是重新命名可怕#definekUnknown不常见的东西,但在那之前,只需重命名enum值别的东西可以作为一个解决方法,例如:

 

// my_header.h 

enum Type 
{ 
    kSomeOtherSymbolThatIsntDefined, 
    kValue1, 
    kValue2 
}; 
 

无论如何,希望这个答案对别人有帮助,因为这个错误的原因让我很难过一天半。