C++ 错误C2059:语法错误:';字符串';
我看过其他帖子,说实话,我仍然不确定是什么导致了这个问题。我在VisualStudio和 我有以下代码:(这是一个C main) 它使用以下cpp代码: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];
#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,当编译器在myenum
中找到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 uhmarp\u管道。h
有16行,空的也算,我不是windows程序员,但没有得到EXTERNC
,这是什么?@GrijeshChauhanEXTERNC
这里解析为extern“c”
,这使得函数名具有C链接,因此可以在C程序中使用。这不是Windows特有的功能!在这里阅读更多:@ GrijeshChauhan:代码> ExtNeX//COD>在C++编译器编译时扩展到