Visual studio: скрытие блоков ifdef - PullRequest
3 голосов
/ 16 июня 2009

При работе в кроссплатформенном проекте, скорее всего, вы встретите много блоков #ifdef в коде. Это на самом деле очень раздражает и затрудняет чтение кода.

Интересно, есть ли способ скрыть эти несвязанные блоки ifdef? Я использую Visual Studio 2005.

Например, если у вас есть этот код:

#ifdef _PC_
do a
#else
do b
#endif

если определено _PC_, инструмент / плагин должен показывать только это:

do A

Ответы [ 5 ]

3 голосов
/ 16 июня 2009

Хотя мой ответ не совсем то, что вы ищете, это лучшее, что я знаю.

В Visual Studio 2005 может быть возможно использовать инструмент выделения, чтобы свернуть неиспользуемую часть блока #ifdef.

Еще одна идея, которая приходит на ум, - это разбить специфичный для ОС код на их собственные файлы и использовать мастер-файл, содержащий блоки #ifdef и важные части (т. Е. Полные объявления) кода, которые не меняются на разных платформах. *

Еще одна вещь, которая приходит на ум, - это просто группировать код для условных блоков там, где это возможно. Во многих ситуациях порядок кода может не иметь большого значения, и вы можете сгруппировать этот код вместе.

Другая вещь, которую можно сделать, если вы хотите использовать файл только в качестве справочного материала, - это запустить файл через препроцессор, который обрабатывает только условные блоки и игнорирует все, что не требуется для обработки условных блоков.

1 голос
/ 21 августа 2010

Я бы предложил не делать то, о чем вы просили. Сокрытие того факта, что ваш код является мультиплатформенным, может легко привести к вам или кому-то еще, не осознавая код, к которому они прикасаются, необходимо изменить для каждой платформы.

Например, что если вы добавите строку сразу после строки do A? Как вы скажете, если он идет внутри или снаружи блока? Эта новая строка, которую вы добавляете, также может нуждаться в соответствующей альтернативной строке в другом разделе. Или, если он выходит за пределы блока, вы можете сломать другую версию, даже не зная об этом.

Это может показаться неудобным, но таков язык. Лучше всего привыкнуть к отображению языка так, как оно задумано, и так же, как все остальные используют его, а не пытаться взломать вещи по своему вкусу.

1 голос
/ 16 июня 2009

Самый чистый метод, который я видел (и использовал), - это использовать шаблон стратегии , с помощью которого вы можете абстрагировать код платформы для отдельного класса стратегии.

например.

class MyAbstractClass
{
    static MyAbstractClass Create()
    {
        #ifdef win32
        return new WindowsClass(); // this could be a shared_ptr
        #else
        return new PosixClass();
        #endif
    }
    virtual method MyMethod() = 0;
}

// windows_class.cpp
class WindowsClass : public MyAbstractClass
{
    virtual method MyMethod()
    {
        // platform specific code here
    }
}

// posix_class.cpp
class PosixClass : public MyAbstractClass
{
    virtual method MyMethod()
    {
        // platform specific code here
    }
}
0 голосов
/ 16 июня 2009

Установите решение для каждой платформы, с которой вы работаете, с соответствующими макросами, определенными в каждой. Включите исходные файлы во все решения. Затем просмотрите и сверните разделы кода, которые не соответствуют платформе для текущего решения.

Visual Studio сохранит параметры свернутого раздела для каждого решения, поэтому вы увидите различный расширенный код в зависимости от проекта, который вы открываете. Я думаю, что это хранится в файлах * .suo.

0 голосов
/ 16 июня 2009

Просто используйте следующую директиву препроцессора:

#region IfDef
    #ifdef PC
        doSomethingCalledA();
    #else
        doSomethingCalledB();
    #endif
#endregion
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...