Поделиться через


/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

  1. Откройте диалоговое окно Страницы свойств проекта. Подробнее см. в статье Настройка компилятора C++ и свойства сборки в Visual Studio.

  2. Выберите страницу свойств>конфигурации C/C++>Language.

  3. Измените свойство Remove unreferenced code и data , а затем нажмите кнопку "ОК".

См. также

/Zc (Соответствие)