C статические правила переопределения встроенной функции - PullRequest
2 голосов
/ 23 июня 2011

Предположим, в bar.h существует может существует:

static inline int fun () { return 2; }

И чтобы всегда определять fun, foo.h содержит следующее:

static inline int fun () { return 3; }

Вызывает ли следующее неопределенное поведение, когда bar.h содержит определение?

#include "foo.h" /* ensure there is always a definition */
#include "bar.h" /* use the bar definition if it exists */

int main () {
   /* ... */
   int x = fun ();
   /* ... */

С gcc (4.0.1) (старый, но это то, что у меня сейчас) поведение такое, как и ожидалось - версия foo используется, когда версия бара отсутствует, а версия бара используется, когда она существует.

Ответы [ 3 ]

9 голосов
/ 23 июня 2011

Нет, это не разрешено.Эти определения fun() объявляют fun() внутренней связью (из-за static), а §6.9 в стандарте C гласит:

Не должно быть более одного внешнего определениядля каждого идентификатора, объявленного с внутренней связью в единице перевода.

Нарушение предложения "така "является неопределенным поведением, что означает, что семантика вашей программы полностью неопределена, а компилятордолжны выдать сообщение об ошибке.

3 голосов
/ 23 июня 2011

Вам не разрешено это делать, и ваш компилятор не должен позволять вам.

Вы можете иметь несколько определений нестатической встроенной функции, только если все определения идентичны (но не более одного определения на TU). Это обязательно произойдет для встроенных функций, определенных в заголовочных файлах.

Для статической связи каждый TU может иметь различное определение, но вы все равно можете иметь только одно определение на TU.

(извините за множественные правки.)

1 голос
/ 23 июня 2011

Если вы хотите добиться того же эффекта, вы можете использовать безвредный макрос:

// foo.h - include guards omitted because of iPhone
#ifndef VALUE
# define VALUE 2
#endif

static inline int fun() { return VALUE; }

// bar.h
#define VALUE 3
#include "foo.h"

Включить сальдо заказа, но это менее страшно, чем полная версия макроса (что совсем не страшно ИМХОно я не знаю ваших / ваших рабочих отношений с макросами.)

...