Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 错误C2059:语法错误:';字符串';_C++_C_Visual Studio 2010_Error Handling - Fatal编程技术网

C++ 错误C2059:语法错误:';字符串';

C++ 错误C2059:语法错误:';字符串';,c++,c,visual-studio-2010,error-handling,C++,C,Visual Studio 2010,Error Handling,我看过其他帖子,说实话,我仍然不确定是什么导致了这个问题。我在VisualStudio和 我有以下代码:(这是一个C main) 它使用以下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];

我看过其他帖子,说实话,我仍然不确定是什么导致了这个问题。我在VisualStudio和

我有以下代码:(这是一个C main)

它使用以下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

请给我一些帮助,我已经看了其他关于c2059的帖子,但是仍然没有任何进展

更改您的
exec
声明以使用您费尽心思定义的
EXTERNC

EXTERNC char *exec(char* cmd, char* arp_cache, FILE* pipe);
extern“C”用于告诉编译器将其设置为C语法,但您的意思是清除一个名为exec的extern函数。你只需要把它融合到不同的地方。因此,请在arp_piping.h中像这样重写代码:

/*extern "C"*/ char *exec(char* cmd, char* arp_cache, FILE* pipe);
然后在cpp文件中删除外部“C”的预修复。 如果您想使用C语法将其简化,只需在cpp中设置调用函数exec的参数,因此如下所示:

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

我在向项目添加
enum
时遇到了这个编译错误。事实证明,
enum
定义中的一个值与预处理器
#define
的名称冲突

enum
看起来如下所示:


// my_header.h

enum Type 
{
   kUnknown,
   kValue1,
   kValue2
};

// ancient_header.h

#define kUnknown L"Unknown"
然后在其他地方有一个
#define
,包含以下内容:


// my_header.h

enum Type 
{
   kUnknown,
   kValue1,
   kValue2
};

// 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,当编译器在my
enum
中找到
kUnknown
符号时,它生成了一个错误,因为该符号已用于定义字符串。这导致了我看到的晦涩的
语法错误:“string”

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

<>这并没有帮助这是在一个非常大的C++项目中,并且<代码>定义了<代码>,它是一个完全独立的编译单元,它是由15年前的某人编写的。 显然,从这里开始正确的做法是将可怕的
#define
重命名为比
kUnknown
更不常见的值,但在此之前,只需将
enum
值重命名为其他值即可修复,例如:


// my_header.h

enum Type 
{
   kSomeOtherSymbolThatIsntDefined,
   kValue1,
   kValue2
};

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

\include
missing@GrijeshChauhan我使用Visual Studio,如果你定义了一个<代码> ExtNC < /Cuff>宏C++,那么我们没有那个头文件,你为什么不用它呢?此外,如果
#ifndef ARP_PIPING_H
被认为是一个包含保护,则
#endif
需要位于标题的末尾。现在,您阻止了对
ARP\u PIPING\u H
的双重定义,但这没有任何作用。您向我们展示了12行
ARP\u PIPING.H
,在第14行报告了编译错误。定义您自己的“exec”是令人困惑的,因为有类似命名的标准库函数,尽管它不应该引起任何特别的麻烦。您没有向我们展示
\include
语句,用于
main.c
@Tony D uhm
arp\u管道。h
有16行,空的也算,我不是windows程序员,但没有得到
EXTERNC
,这是什么?@GrijeshChauhan
EXTERNC
这里解析为
extern“c”
,这使得函数名具有C链接,因此可以在C程序中使用。这不是Windows特有的功能!在这里阅读更多:@ GrijeshChauhan:代码> ExtNeX//COD>在C++编译器编译时扩展到 Extn(C) >,否则扩展为No.0。因此,C代码看到一个正则函数声明,而C++看到一个特殊声明,声明声明是用C链接的符号(也就是说,当试图解析符号时,不要把名字加错)。.jxh实际上这是我不理解的代码> C++,但它看到一个特殊声明,声明声明是用C链接< /COD> >的符号。这意味着什么?在C++中,代码> ExtNC CHAR * Exc(ch/<代码)将扩展为<代码>外“C”char * Exc(ch/c>)<代码>外部“C”的含义是什么?<代码>?它对C++编译器有什么用?code@GrijeshChauhanC++代码是如何调用C库函数的,有时也可以用C++语言提供C函数的函数接口。用于告诉编译器将其设置为C语法不,不是。是关于调用约定的,就是这样。调用约定是什么意思?您能再解释一下吗?首先感谢您的提示