3

私は他の投稿を見てきましたが、正直なところ、何が問題を引き起こしているのかまだわかりません. 私はVisual Studioでプログラミングしており、

私は次のコードを持っています:(これは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に関する他の投稿を見ましたが、まだどこにも行きません

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定義内の値の 1 つで、プリプロセッサと名前が競合していることが判明しました#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
};

とにかく、うまくいけば、このエラーの原因が私を1日半悩ませたので、この答えが他の誰かに役立つことを願っています.

于 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 に答える