为什么VS2017警告“输入函数定义未找到”函数在输入typedef'd时声明的前向函数定义?

问题描述:

我试图模仿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

Some programmer dudea comment提供了答案:

使用智能感知在Visual Studio中的解析器是不实际的编译器使用相同的解析器。所以有些情况(比如你的显然)在两者不同的地方。