Предположим, у вас есть большой проект, написанный на c ++, который содержит тысячу файлов .cpp и тысячу файлов .h. И давайте предположим, что проект также зависит от десяти статических библиотек. Скажем, мы работаем над Windows, и мы строим наш проект в Visual Studio 20xx. Когда вы нажимаете Ctrl + F7 Visual Studio, чтобы начать компиляцию всего решения (предположим, что у нас есть только один проект в решении)
В чем смысл компиляции?
Второй этап компиляции выполняется Linker.Linker должен объединить весь объектный файл и построить окончательно вывод (который может быть исполняемым или библиотекой)
Шаги при связывании проекта
error LNK2001: unresolved external symbol "void __cdecl foo(void)" (?foo@@YAXXZ)
Наблюдение
Как решить эту ошибку
Ошибка времени компилятора:
Ошибка времени компоновщика
#pragma once
, чтобы компилятор не включал один заголовок если он уже был включен в текущий .cpp, который скомпилирован Существует несколько подходов.
Один из них заключается в использовании fancy regex ... (?:/(?P<title>[a-zA-Z]+)/)?
Создание маркера URL-адреса регулярного выражения Django Необязательно
Другое , проще следовать за порядком - это иметь несколько правил, которые соответствуют вашим потребностям, все указывают на один и тот же вид.
urlpatterns = patterns('',
url(r'^project_config/$', views.foo),
url(r'^project_config/(?P<product>\w+)/$', views.foo),
ulr(r'^project_config/(?P<product>\w+)/(?P<project_id>\w+)/$', views.foo),
)
Имейте в виду, что в вашем представлении вам также необходимо установить значение по умолчанию для необязательный параметр URL, или вы получите сообщение об ошибке:
def foo(request, optional_parameter=''):
# Your code goes here
Вы можете использовать вложенные маршруты
Django & lt; 1.8
urlpatterns = patterns(''
url(r'^project_config/', include(patterns('',
url(r'^$', ProjectConfigView.as_view(), name="project_config")
url(r'^(?P<product>\w+)$', include(patterns('',
url(r'^$', ProductView.as_view(), name="product"),
url(r'^(?P<project_id>\w+)$', ProjectDetailView.as_view(), name="project_detail")
))),
))),
)
Django> = 1.8
urlpatterns = [
url(r'^project_config/', include([
url(r'^$', ProjectConfigView.as_view(), name="project_config")
url(r'^(?P<product>\w+)$', include([
url(r'^$', ProductView.as_view(), name="product"),
url(r'^(?P<project_id>\w+)$', ProjectDetailView.as_view(), name="project_detail")
])),
])),
]
Это намного больше DRY (скажем, вы хотели переименовать product
kwarg в product_id
, вам нужно изменить строку 4, и это повлияет на приведенные ниже URL.
Отредактировано для Django 1.8 и выше
Еще проще использовать:
(?P<project_id>\w+|)
. «(a | b)» означает a или b, поэтому в вашем случае это будет один или несколько символов слова (\ w +) или ничего .
Таким образом, это будет выглядеть так:
url(
r'^project_config/(?P<product>\w+)/(?P<project_id>\w+|)/$',
'tool.views.ProjectConfig',
name='project_config'
),
Думаю, я бы добавил немного к ответу.
Если у вас несколько определений URL-адресов, вам придется называть их каждый отдельно. Таким образом, вы теряете гибкость при вызове reverse, поскольку один обратный будет ожидать параметр, а другой - нет.
Другой способ использования регулярного выражения для размещения необязательного параметра:
r'^project_config/(?P<product>\w+)/((?P<project_id>\w+)/)?$'