2016-01-27 4 views
0

Скажем, у меня есть следующие файлы. Является ли этот недопустимый C++ (линкера, так что да), или это ошибка в моем синтаксисе? Должно ли форвардное объявление функции constexpr быть в том же файле, что и его определение?Переслать объявление функции constexpr в заголовке

header.h

extern constexpr int fun(int); 

source.cpp

constexpr int fun(int x) 
{ 
    return x * 2; 
} 
+0

@NathanOliver: Связанные, но разные правила применяются к функциям vs classes. Это не дубликат. –

+0

@BenVoigt Вот почему я не голосовал. Ответ должен работать. – NathanOliver

ответ

2

Это неправильно. constexpr подразумевает, что функция является встроенной. Встроенные функции должны быть определены в каждой единицы перевода, где она используется. Если вы включите этот заголовок в блок переводов, отличный от source.cpp, и используйте эту функцию, эта единица перевода не имеет определения.

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

Это не обязательно должно быть в одном файле, но поскольку определение должно быть в каждом файле, который использует эту функцию, проще всего определить его в том же заголовке.

+2

'extern inline' в порядке, но это' extern' по умолчанию так лишнее. –

Смежные вопросы