Я пытаюсь подражать тому, как 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?
Какой-то программист чувак предоставил ответ в комментарий:
Парсер, используемый IntelliSense внутри Visual Studio, — это не тот парсер, который используется фактическим компилятором. Поэтому есть случаи (как, по-видимому, ваш), где они различаются.
Других решений пока нет …