Почему VS2017 предупреждает "Определение функции не найдено" для функций пересылки, объявленных с вводом typedef'd, но определенных с оригиналом?
Я пытаюсь подражать тому, как CURL реализует внутреннюю структуру CURL как Curl_easy, так что пользователи API используют имя структуры CURL, а API внутренне ссылается на CURL как Curl_easy.
Это делается с помощью
typedef struct Curl_easy CURL
в curl/curl.h, а затем, имея
CURL_EXTERN CURL *curl_easy_init(void);
а также
struct Curl_easy *curl_easy_init(void)
в curl / 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 ответ
Some programmer dude дал ответ в комментарии:
Парсер, используемый IntelliSense внутри Visual Studio, - это не тот парсер, который используется фактическим компилятором. Поэтому есть случаи (как, по-видимому, ваш), где они различаются.