3

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

4

3 回答 3

2

更改您的exec声明以使用EXTERNC您煞费苦心定义的宏。

EXTERNC char *exec(char* cmd, char* arp_cache, FILE* pipe);
于 2013-07-19T08:27:56.567 回答
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'd,当编译器遇到kUnknownmy 中的符号时enum,它会生成错误,因为该符号已用于定义字符串。syntax error: 'string'这导致了我所看到的神秘。

这令人难以置信的混乱,因为定义中的所有内容似乎都是正确的,enum并且可以自行编译。

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

显然,从这里开始正确的做法是将可怕#define的东西重命名为不常见的东西kUnknown,但在那之前,只需将enum值重命名为其他东西就可以解决问题,例如:


// my_header.h

enum Type 
{
   kSomeOtherSymbolThatIsntDefined,
   kValue1,
   kValue2
};

无论如何,希望这个答案对其他人有帮助,因为这个错误的原因让我困扰了一天半。

于 2016-04-04T20:59:36.827 回答
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"
}
于 2013-07-19T08:36:49.100 回答