Bagikan melalui


/Zc:inline (Hapus COMDAT yang tidak direferensikan)

Menghapus data atau fungsi yang tidak direferensikan yang merupakan COMDAT, atau yang hanya memiliki tautan internal. Di bawah /Zc:inline, pengkompilasi menentukan bahwa unit terjemahan dengan data atau fungsi sebaris juga harus menyertakan definisinya.

Sintaks

/Zc:inline[-]

Keterangan

Ketika /Zc:inline ditentukan, pengkompilasi tidak memancarkan informasi simbol untuk fungsi atau data COMDAT yang tidak direferensikan. Atau, untuk data atau fungsi yang hanya memiliki tautan internal. Pengoptimalan ini menyederhanakan beberapa pekerjaan yang dilakukan linker dalam build rilis, atau saat Anda menentukan /OPT:REF opsi linker. Pengoptimalan kompilator ini dapat secara signifikan mengurangi ukuran file .obj dan meningkatkan kecepatan linker. Opsi pengkompilasi tidak diaktifkan saat Anda menonaktifkan pengoptimalan (/Od). Atau, saat Anda menentukan /GL (pengoptimalan Program Siapa le).

Secara default, opsi ini nonaktif (/Zc:inline-) dalam build baris perintah. Opsi /permissive- tidak mengaktifkan /Zc:inline. Dalam proyek MSBuild, opsi diatur oleh Properti>Konfigurasi C/C++>Bahasa>Hapus kode dan properti data yang tidak direferensikan, yang diatur ke Ya secara default.

Jika /Zc:inline ditentukan, kompilator memberlakukan persyaratan C++11 bahwa semua fungsi yang dideklarasikan inline harus memiliki definisi yang tersedia di unit terjemahan yang sama jika digunakan. Ketika opsi tidak ditentukan, pengkompilasi Microsoft memungkinkan kode yang tidak sesuai yang memanggil fungsi yang dideklarasikan inline bahkan jika tidak ada definisi yang terlihat. Untuk informasi selengkapnya, lihat standar C++11, di bagian 3.2 dan bagian 7.1.2. Opsi pengompilasi ini diperkenalkan di Visual Studio 2013 Update 2.

Untuk menggunakan opsi , /Zc:inline perbarui kode yang tidak sesuai.

Contoh ini menunjukkan bagaimana penggunaan deklarasi fungsi sebaris yang tidak sesuai tanpa definisi masih mengkompilasi dan menautkan saat opsi default /Zc:inline- digunakan:

File sumber 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() {};
};

File sumber 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
}

File sumber 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
}

Ketika /Zc:inline diaktifkan, kode yang sama menyebabkan kesalahan LNK2019, karena pengkompilasi tidak memancarkan isi kode yang tidak bergaris untuk Example::inline_call di .example.obj Kode yang hilang menyebabkan panggilan tidak berbaris masuk main untuk mereferensikan simbol eksternal yang tidak ditentukan.

Untuk mengatasi kesalahan ini, Anda dapat menghapus inline kata kunci dari deklarasi , atau memindahkan definisi Example::inline_call ke dalam file header, atau memindahkan implementasi Example::inline_callExample ke dalam main.cpp. Contoh berikutnya memindahkan definisi ke dalam file header, di mana itu terlihat oleh pemanggil apa pun yang menyertakan header.

File sumber 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() {};
};

File sumber 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();
}

File sumber 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
}

Untuk informasi selengkapnya tentang masalah kesuaian di Visual C++, lihat Perilaku nonstandar.

Untuk mengatur opsi pengkompilasi ini di lingkungan pengembangan Visual Studio

  1. Buka kotak dialog Halaman Properti proyek. Untuk detailnya, lihat Mengatur pengkompilasi C++ dan membuat properti di Visual Studio.

  2. Pilih halaman properti Properti>Konfigurasi C/C++>Language.

  3. Ubah properti Hapus kode dan data yang tidak direferensikan, lalu pilih OK.

Baca juga

/Zc (Kesuaian)