Существует ли способ использовать предварительно скомпилированные заголовки в VC ++, не требуя stdafx.h?

В Android нет собственного способа для этого, но я написал пример кода того, как вы можете легко достичь того, что вы хотите. Вы просто устанавливаете прослушиватель длинных щелчков на textview, и внутри него вы показываете AlertDialog для всплывающих окон, который имеет возможность вставки, и когда вы нажимаете, он использует ClipboardManager для получения основного содержимого в буфере обмена. В зависимости от ваших потребностей вы можете настроить код и использовать что угодно вместо AlertDialog (например, мы использовали контекстное меню раньше, но оно вызывало сбои в различных версиях Android, поэтому мы заменили его на AlertDialog). Дайте мне знать, если у вас есть вопросы.

    textView.setLongClickable(true);
    textView.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View v) {
            AlertDialog.Builder builder;
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                builder = new AlertDialog.Builder(ArticleActivity.this, android.R.style.Theme_Material_Dialog_Alert);
            } else {
                builder = new AlertDialog.Builder(ArticleActivity.this);
            }
            builder.setTitle("Paste")
                    .setMessage("Are you sure you want to paste this entry?")
                    .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {
                            ClipboardManager clipboardManager = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
                            if (clipboardManager != null) {
                                Log.e("TAG", "clipboard:" + clipboardManager.getPrimaryClip());
                            }
                        }
                    })
                    .setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {
                            // do nothing
                        }
                    })
                    .show();
            return true;
        }
    });
10
задан hippietrail 1 April 2011 в 14:44
поделиться

8 ответов

Да, существует лучший путь.

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

Лучший путь, снова по моему скромному мнению, состоит в том, чтобы использовать #pragma hdrstop и/Yc и/Yu. Это позволяет Вам легко настроить конфигурации сборки, которые ДЕЙСТВИТЕЛЬНО используют предварительно скомпилированные заголовки и также конфигурации сборки, которые не используют предварительно скомпилированные заголовки. Файлы, которые используют предварительно скомпилированные заголовки, не имеют прямой зависимости от самого предварительно скомпилированного заголовка в исходном файле, который позволяет им быть сборкой с или без предварительно скомпилированного заголовка. Файл проекта определяет, какой исходный файл создает предварительно скомпилированный заголовок, и #pragma hdrstop строка в каждом исходном файле определяет, который включает, взяты от предварительно скомпилированного заголовка (если используется) и которые взяты непосредственно от исходного файла... Это означает при выполнении обслуживания использование конфигурации, которая не использует предварительно скомпилированные заголовки и только код, который необходимо восстановить после того, как изменение заголовочного файла восстановит. При выполнении полных сборок можно использовать предварительно скомпилированные конфигурации заголовка для ускорения процесса компиляции. Другая хорошая вещь о наличии непредварительно скомпилированной опции сборки заголовка состоит в том, что это удостоверяется, что Ваши cpp файлы только включают то, что они нуждаются и включают все, в чем они нуждаются (что-то, что твердо, если Вы используете 'стиль мастера' предварительно скомпилированного заголовка.

Я записал немного о том, как это работает здесь: http://www.lenholgate.com/blog/2004/07/fi-stlport-precompiled-headers-warning-level-4-and-pragma-hdrstop.html (игнорируют материал о/FI) и у меня есть некоторые проекты в качестве примера, которые создают с #pragma hdrstop и/Yc/Yu метод здесь: http://www.lenholgate.com/blog/2008/04/practical-testing-16---fixing-a-timeout-bug.html.

Конечно, добираясь от 'стиля мастера' предварительно скомпилированное использование заголовка к более управляемому стилю часто нетривиально...

9
ответ дан 3 December 2019 в 18:36
поделиться

При нормальном использовании предварительно скомпилированных заголовков "stdafx.h" служит 2 целям. Это определяет ряд стабильного, распространенный включают файлы. Также в каждом .cpp файле, это служит маркером как, где предварительно скомпилированные заголовки заканчиваются.

Походит на то, что Вы хотите сделать:

  • Оставьте предварительно скомпилированный заголовок включенным.
  • Уезжайте "stdafx.h" включают в каждый .cpp файл.
  • Опустошите включение от "stdafx.h".
  • Для каждого .cpp файла фигура, которая включает, была необходима от старого "stdafx.h". Добавьте их перед #include "stdafx.h" в каждом .cpp файле.

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

4
ответ дан 3 December 2019 в 18:36
поделиться

Нет, существует, вероятно, НЕ лучший путь.

Однако для данного отдельного .cpp файла, Вы могли бы решить, что Вам не нужен предварительно скомпилированный заголовок. Вы могли изменить настройки для того одного .cpp файла и удалить stdafx.h строку.

(На самом деле, тем не менее, я не делаю, как предварительно скомпилированная схема заголовка вмешивается в запись Ваших модульных тестов).

2
ответ дан 3 December 2019 в 18:36
поделиться

Да. Имя "stdafx.h/stdafx.pch" является просто конвенцией. Можно дать каждому .cpp его собственный предварительно скомпилированный заголовок. Этого, вероятно, было бы самым легким достигнуть маленьким сценарием для редактирования XML в .vcproj. Оборотная сторона: Вы заканчиваете с большой стопкой предварительно скомпилированных заголовков, и они не совместно используются TU's.

Возможный, но умный? Я не могу сказать наверняка.

2
ответ дан 3 December 2019 в 18:36
поделиться

Мой совет - не удаляют предварительно скомпилированные заголовки, если Вы не хотите сделать свои сборки крайне медленными. У Вас в основном есть три опции здесь:

  1. Избавьтесь от предварительно скомпилированных заголовков (не рекомендуемый)
  2. Создайте отдельную библиотеку для унаследованного кода; тем путем можно создать его отдельно.
  3. Используйте несколько предварительно скомпилированных заголовков в рамках единственного проекта. Можно выбрать отдельные файлы C++ в Проводнике Решения и сказать им который precomiled заголовок использовать. Необходимо было бы также установить OtherStdAfx.h/cpp для генерации предварительно скомпилированного заголовка.
1
ответ дан 3 December 2019 в 18:36
поделиться

Нет. предварительно скомпилированные заголовки полагаются на единственный заголовок, включенный всеми источниками, скомпилировал этот путь. можно указать для единственного источника (или все) для не использования предварительно скомпилированных заголовков вообще, но это не то, что Вы хотите.

В прошлом компилятор Borland C++ сделал предварительную компиляцию без определенного заголовка. однако, если два исходных файла включали те же заголовки, но в другом порядке, они были скомпилированы отдельно, с тех пор, действительно, порядок заголовочных файлов в C++ может иметь значение...

Таким образом это означает, что предварительно скомпилированные заголовки Borland действительно экономили время, только если Вы очень твердо включали источники в тот же порядок или имели сингл, включают файл, включенный (сначала) всеми другими файлами... - звучит знакомым?!?!

2
ответ дан 3 December 2019 в 18:36
поделиться

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

Для объема кода я не использую предварительно скомпилированные заголовки.

G.

0
ответ дан 3 December 2019 в 18:36
поделиться

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

Другая вещь рассмотреть состоит в том, что у Вас может быть один pch на библиотеку. Таким образом, Вы можете разводиться, Ваш код в меньшие библиотеки и иметь каждого из них имеют более трудный набор зависимостей.

1
ответ дан 3 December 2019 в 18:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: