Имеет ли значение extern для объявления функций с помощью inline? - PullRequest
0 голосов
/ 18 октября 2019

Как указано в стандарте

Если объявление идентификатора для функции не имеет спецификатора класса хранения, его связь определяется точно так же, как если бы она была объявлена ​​с помощью спецификатора класса хранения extern.

Но часть спецификатора функции дает inline семантику функции следующим образом:

Любая функция с внутренней связью может быть встроенной функцией. Для функции с внешним связыванием применяются следующие ограничения: Если функция объявлена ​​со встроенным спецификатором функции, то она также должна быть определена в той же единице перевода. Если все объявления области действия файла для функции в модуле перевода включают спецификатор встроенной функции без extern, то определение в этом модуле перевода является встроенным определением.

Случай 1.

static inline void test(void){ //internal linkage, can be an inline function
    printf("Test\n");
}

inline void test(void); //does it provide an external definition?

Дело 2.

static inline void test(void){ //internal linkage, can be an inline function
    printf("Test\n");
}

extern inline void test(void); //does it provide an external definition?

Дело 3.

static inline void test(void){ //internal linkage, can be an inline function
    printf("Test\n");
}

void test(void); //does it provide an external definition?

Iиметь путаницу в отношении трех случаев. Есть ли различия между ними? В настоящее время я думаю о них как о

Случай 1 - не предоставляет внешнего определения (inline без extern)

Случай 2 - обеспечивает внешнее определение (inline с extern)

Случай 3 - обеспечивает внешнее определение (аналогично extern)

1 Ответ

2 голосов
/ 18 октября 2019

static и extern не могут идти вместе.

static inline void test(void){ //internal linkage, can be an inline function
    printf("Test\n");
}

inline void test(void); //does it provide an external definition?

на самом деле должно быть

static inline void test(void){ //internal linkage, can be an inline function
    printf("Test\n");
}

static inline void test(void); //does it provide an external definition?

, поскольку определение и объявление должны совпадать. Однако я не уверен, что static действительно необходимо использовать при использовании inline.


Случай 2 - обеспечивает внешнее определение (inline с extern)

Случай 3 - обеспечивает внешнее определение (так же, как с extern)

они фактически конфликтуют (если я правильно понимаю) с:

Любая функция с внутренняясвязь может быть встроенной функцией.

extern в точности соответствует внешней связи, а не внутренней.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...