Макрос BOOST_FOREACH вытесняет метод из пространства имен Visual Studio - PullRequest
0 голосов
/ 06 ноября 2018

Когда я использую макрос BOOST_FOREACH в методе C ++, реализация больше не определяется автоматически, так как метод принудительно выходит из соответствующего пространства имен, как определено Visual Studio (возможно, Intellisense?). Проблем с компиляцией нет. Что здесь происходит?

.h

class testClass
{
public:
    testClass();
    ~testClass();

    void print();
};

.cpp

#include "testClass.h"
#include "stdafx.h"
#include <boost/foreach.hpp> // BOOST_FOREACH
#include <iostream> //std::cout, endl

testClass::testClass()
{
}

testClass::~testClass()
{
}

void testClass::print()
{
    int nums[] = { 1, 2, 3, 4, 5 };
    BOOST_FOREACH(const int a, nums)
    {
        std::cout << a << std::endl;
    }
}

1 Ответ

0 голосов
/ 07 ноября 2018

@ sehe Мой вопрос заключается в том, почему это вызывает макрос повышения, то есть не удается обнаружить реализацию метода в .cpp - Мэтью Грин 10 минут назад

Ответ на этот вопрос таков: макросы являются функцией препроцессора. Полноценная реализация предварительной обработки является дорогостоящим делом как по сложности реализации, так и по стоимости выполнения. Многие инструменты упрощают / используют ярлыки при попытке анализа кода C ++.

Точные результаты могут быть достигнуты только в том случае, если инструменты выполняют полную предварительную обработку и синтаксический анализ точно так же, как это делает компилятор¹. Если вы немного знакомы со сложностью компиляторов, то неудивительно, что очень немногие инструменты делают это.

Наиболее заметным исключением из этого правила является libclang, которое позволяет поставщикам создавать «высокоточные» инструменты C ++ без необходимости реализации всей механики.

По этой причине я использую YouCompleteMe с compiler_commands.json CMake, чтобы убедиться, что libclang всегда использует одни и те же флаги и определения. Это дает лучшие дополнения и диагностику, которые я видел среди IDE и инструментов.

Тем не менее, у меня нет проблем с использованием меньших инструментов (индексация Eclipse на C ++, Microsoft Visual Studio Intellisense, завершение QtCreator²). Это просто то, что исторически связано с областью C ++, что инструменты не всегда могут быть в состоянии ухватить каждую конструкцию.


¹ И он должен использовать одинаковые пути включения, флаги и определения

² Другими заметными упоминаниями являются Doxygen и ... SourceInsight (который я никогда не использовал, но проанализировал здесь: Как я могу заставить SourceInsight понимать умные указатели? )

...