/Zc:inline
(Удаление comDAT без ссылок)
Удаляет неуправляемые данные или функции, которые являются COMDATs или имеют только внутреннюю компоновку. В разделе /Zc:inline
компилятор указывает, что единицы перевода с встроенными данными или функциями также должны включать их определения.
Синтаксис
/Zc:inline
[-
]
Замечания
При /Zc:inline
указании компилятор не выдает сведения о символах для неоправданных функций COMDAT или данных. Или для данных или функций, имеющих только внутреннюю компоновку. Эта оптимизация упрощает некоторые действия компоновщика в сборках выпуска или при указании /OPT:REF
параметра компоновщика. Эта оптимизация компилятора может значительно уменьшить размер файла .obj и повысить скорость компоновщика. Параметр компилятора не включен при отключении оптимизаций (/Od
). Или при указании /GL
(оптимизация всей программы)
По умолчанию этот параметр отключен (/Zc:inline-
) в сборках командной строки. Параметр /permissive-
не включает /Zc:inline
. В проектах MSBuild параметр задается свойством конфигурации>C/C++>Language>Remove unreferenced code и data property, который по умолчанию имеет значение Yes.
Если /Zc:inline
задано, компилятор применяет требование C++11, что все функции, объявленные inline
, должны иметь определение, доступное в одной единице перевода, если они используются. Если параметр не указан, компилятор Майкрософт разрешает несоответствующий код, который вызывает функции, объявленные inline
даже в том случае, если определение не отображается. Подробнее см. в разделах 3.2 и 7.1.2 стандарта C++11. Этот параметр компилятора появился в Visual Studio 2013 с обновлением 2.
Чтобы использовать /Zc:inline
этот параметр, обновите несоответствующий код.
В этом примере показано, как несоответствующее использование встроенного объявления функции без определения по-прежнему компилируется и связывается при использовании параметра по умолчанию /Zc:inline-
:
Исходный файл example.h
:
// example.h
// Compile by using: cl /W4 /EHsc /O2 zcinline.cpp example.cpp
#pragma once
class Example {
public:
inline void inline_call(); // declared but not defined inline
void normal_call();
Example() {};
};
Исходный файл example.cpp
:
// example.cpp
// Compile by using: cl /W4 /EHsc /O2 zcinline.cpp example.cpp
#include <stdio.h>
#include "example.h"
void Example::inline_call() {
printf("inline_call was called.\n");
}
void Example::normal_call() {
printf("normal_call was called.\n");
inline_call(); // with /Zc:inline-, inline_call forced into .obj file
}
Исходный файл zcinline.cpp
:
// zcinline.cpp
// Compile by using: cl /W4 /EHsc /O2 zcinline.cpp example.cpp
#include "example.h"
int main() {
Example example;
example.inline_call(); // normal call when definition unavailable
}
Если /Zc:inline
этот код включен, тот же код вызывает ошибку LNK2019, так как компилятор не выдает нелинейный текст кода дляExample::inline_call
.example.obj
Отсутствующий код приводит к тому, что неустранимый вызов main
ссылается на неопределенный внешний символ.
Чтобы устранить эту ошибку, можно удалить inline
ключевое слово из объявления Example::inline_call
или переместить определение Example::inline_call
в файл заголовка Example
или переместить реализацию в main.cpp
. Следующий пример перемещает определение в файл заголовка, где он отображается любому вызывающему объекту, который включает заголовок.
Исходный файл example2.h
:
// example2.h
// Compile by using: cl /W4 /EHsc /O2 zcinline2.cpp example2.cpp
#pragma once
#include <stdio.h>
class Example2 {
public:
inline void inline_call() {
printf("inline_call was called.\n");
}
void normal_call();
Example2() {};
};
Исходный файл example2.cpp
:
// example2.cpp
// Compile by using: cl /W4 /EHsc /O2 zcinline2.cpp example2.cpp
#include "example2.h"
void Example2::normal_call() {
printf("normal_call was called.\n");
inline_call();
}
Исходный файл zcinline2.h
:
// zcinline2.cpp
// Compile by using: cl /W4 /EHsc /O2 zcinline2.cpp example2.cpp
#include "example2.h"
int main() {
Example2 example2;
example2.inline_call(); // normal call when definition unavailable
}
Дополнительные сведения о проблемах соответствия в Visual C++см. в статье о нестандартном поведении.
Установка данного параметра компилятора в среде разработки Visual Studio
Откройте диалоговое окно Страницы свойств проекта. Подробнее см. в статье Настройка компилятора C++ и свойства сборки в Visual Studio.
Выберите страницу свойств>конфигурации C/C++>Language.
Измените свойство Remove unreferenced code и data , а затем нажмите кнопку "ОК".