Π’Ρ‹ΡˆΠ΅Π» Ρ€Π΅Π»ΠΈΠ· IWYU (ΠΈΠ»ΠΈ include-what-you-use), ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π΅ΠΉ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΈΠ·Π±Ρ‹Ρ‚ΠΎΡ‡Π½Ρ‹Π΅ ΠΈ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Ρ‚ΡŒ Π½Π΅Π΄ΠΎΡΡ‚Π°ΡŽΡ‰ΠΈΠ΅ #include Π² вашСм ΠΊΠΎΠ΄Π΅ Π½Π° C/C++.

«Π’ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΡˆΡŒ» ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅: для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ символа (Ρ‚ΠΈΠΏΠ°, ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ»ΠΈ макроса), ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Π² foo.cc, Π»ΠΈΠ±ΠΎ foo.cc, Π»ΠΈΠ±ΠΎ foo.h Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ .h-Ρ„Π°ΠΉΠ», ΡΠΊΡΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ объявлСниС этого символа. Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚ include-what-you-use – это ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° для Π°Π½Π°Π»ΠΈΠ·Π° #include исходных Ρ„Π°ΠΉΠ»ΠΎΠ² с Ρ†Π΅Π»ΡŒΡŽ поиска Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΠΉ этого ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° ΠΈ Π²Ρ‹Π΄Π°Ρ‡ΠΈ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΉ для исправлСния. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Clang ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Ρ€Π΅Π»ΠΈΠ· ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ с Π½ΠΎΠ²ΠΎΠΉ вСрсиСй Clang.

Основная Ρ†Π΅Π»ΡŒ include-what-you-use — ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ Π»ΠΈΡˆΠ½ΠΈΡ… #include. Для этого Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ #include Π½Π΅ Π½ΡƒΠΆΠ½Ρ‹ Π² Π΄Π°Π½Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ (ΠΊΠ°ΠΊ для .cc, Ρ‚Π°ΠΊ ΠΈ для .h), ΠΈ ΠΏΠΎ возмоТности Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ #include Π½Π° ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ объявлСниС.

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ измСнСния

  • Π‘ΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ с Clang 17.
  • Π£Π»ΡƒΡ‡ΡˆΠ΅Π½ Π°Π½Π°Π»ΠΈΠ· псСвдонимов Ρ‚ΠΈΠΏΠΎΠ² (typedef ΠΈ using).
  • Π£Π»ΡƒΡ‡ΡˆΠ΅Π½ Π°Π½Π°Π»ΠΈΠ· псСвдонимов пространств ΠΈΠΌΠ΅Π½ (namespace xyz = foobar).
  • Π£Π»ΡƒΡ‡ΡˆΠ΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚Ρ‹Ρ… ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΠΉ (typedef struct Foo Bar;).
  • Π£Π»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ «Π°Π²Ρ‚окаста» ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, особСнно ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ со слоТными ΡˆΠ°Π±Π»ΠΎΠ½Π½Ρ‹ΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ.
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° новая ΠΏΡ€Π°Π³ΠΌΠ° IWYU: always_keep, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π°Ρ ΠΏΠΎΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ всСгда Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒΡΡ, Π³Π΄Π΅ Π±Ρ‹ ΠΎΠ½ Π½ΠΈ Π±Ρ‹Π» Π²ΠΊΠ»ΡŽΡ‡Π΅Π½.
  • АвтоматичСскоС использованиС сопоставлСний для builtins libc++, Ссли libc++ являСтся Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΉ стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ.
  • Π£Π»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΠ΅ сопоставлСний для Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ² libc++ ΠΈ posix.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: linux.org.ru

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ