0

我試圖模仿CURL如何將CURL結構內部實現爲Curl_easy,以便API用戶使用結構名稱CURL,並將API內部引用CURL作爲Curl_easy。爲什麼VS2017警告「輸入函數定義未找到」函數在輸入typedef'd時聲明的前向函數定義?

這是通過在捲曲/ curl.h具有

typedef struct Curl_easy CURL 

然後具有

CURL_EXTERN CURL *curl_easy_init(void); 

struct Curl_easy *curl_easy_init(void) 
在捲曲/ easy.h和easy.c

完成, 分別。

所以我複製的想法,做了一個小例子應該做同樣的事情:

typedef struct IntStruct IS; 

IS* initializeIS(); 
void countUpIS(IS* is); 

struct IntStruct 
{ 
    int i; 
}; 

IntStruct* initializeIS() 
{ 
    IntStruct* is = new IntStruct; 
    is->i = 0; 
    return is; 
} 

void countUpIS(IntStruct* is) 
{ 
    is->i++; 
} 

#include <iostream> 
using namespace std; 

int main(int argc, char* argv[]) 
{ 
    IS* is = initializeIS(); 
    countUpIS(is); 
    cout << is->i << endl; 

    return 0; 
} 

就剩下的那些功能initializeIS()和countUpIS()使用結構名的用戶「IS」但開發商這些函數將其稱爲「IntStruct」。

此代碼編譯並運行正常,但VS2017似乎將綠色下劃線countUpIS定義爲「countUpIs'未找到的函數定義」。

爲什麼會出現這種情況?一些完全合法但在VS2017中解析不好的東西?

+1

Visual Studio中IntelliSense使用的解析器與實際編譯器使用的解析器不同。所以有些情況(比如你的顯然)在兩者不同的地方。 –

+0

我製作了一個文件的副本,並在Cygwin上使用GCC使用GCC構建它,並且沒有任何問題。 你錯過了什麼嗎?源代碼的組織與上述不同嗎?是頭文件中的一些代碼? – user2304458

回答

0

Some programmer dudea comment提供了答案:

使用智能感知在Visual Studio中的解析器是不實際的編譯器使用相同的解析器。所以有些情況(比如你的顯然)在兩者不同的地方。