Почему 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, - это не тот парсер, который используется фактическим компилятором. Поэтому есть случаи (как, по-видимому, ваш), где они различаются.

Другие вопросы по тегам