Макро проти статичних функцій у заголовку


9

для багатьох швидких завдань, де можна було б використовувати функцію f(x,y), у звичайному C використовуються макроси. Я хотів би запитати конкретно про ці випадки, які вирішуються викликом функції (тобто макроси, що використовуються для вбудованих функцій, а не для розширення коду довільного коду).

Зазвичай функції C не є впорядкованими, оскільки вони можуть бути пов'язані з іншими файлами C. Однак статичні функції C видно лише з файлу C, в якому вони визначені. Тому їх можна позначати компіляторами. Я чув, що багато макросів слід замінити, перетворивши їх на статичні функції, оскільки це створює більш безпечний код.

Чи бувають випадки, коли це не дуже гарна ідея?

Знову ж таки: не запитувати про макроси виробництва-коду з ## однаковими конструкціями, які взагалі не можуть бути виражені функцією.


4
Я думаю , ваше запитання , можливо, був дан відповідь тут stackoverflow.com/questions/9104568/macro-vs-function-in-c і тут stackoverflow.com/questions/1358232/why-use-macros-in-c
Мару

написання правильного макросу - це біль, і inlineфункції ing просто гарантують, що його можна визначити кілька разів у двійковій формі , компілятор може вирішити, чи дійсно він буде вбудований, можливо, заощадити місце
ratchet freak

2
Я б фактично підозрював, що більшість із них є історичними причинами. Віки тому компілятори C взагалі не вбудовували функції. Тож люди використовували макроси для речей, які хотіли окреслити. Код С, як правило, незвично довгожив.
Ян Худек

@ratchetfreak: C не має inline, це не про C ++.
wirrbel

2
@wirrbel Звичайно, є inlineв С, принаймні з C99. Для швидкого огляду див. Вікіпедію про вбудовані функції .
амон

Відповіді:


6

Макроси, які можна вирішити за допомогою виклику функції, мають безліч підводних каменів:

  • Їх важко написати, тому що вам, можливо, доведеться правильно обробляти такі аргументи ++i.
  • Їх важко налагодити за допомогою візуального налагодження, оскільки ви не можете перейти через макрос або поставити там точку розриву.
  • З ними важко правильно впоратися, аналізуючи залежності компіляцій.

Макроси, які можна вирішити за допомогою виклику функції, могли бути корисними для надання вбудовування в примітивний компілятор. Мені не відомо, що жоден компілятор не обробляє вбудовані функції, а деякі можуть навіть вбудовуватись через одиниці компіляції.

Зазвичай функції C не є впорядкованими, оскільки вони можуть бути пов'язані з іншими файлами C.

Немає жодної причини, чому компілятор не зміг би надати дві версії функції, традиційну callта inlineодну. Ви повинні переглянути документацію компілятора, на який ви орієнтуєтесь. Крім того, ви можете поглянути на згенеровану збірку: навіть якщо ви не знаєте складання, ви можете швидко навчитися визначати, чи була якась функція вбудована чи ні. (Почніть з дитячих прикладів, щоб швидко це дізнатися.)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.