Итак, у меня есть кусок кода, который выглядит так.
typedef struct {
int foo;
int bar;
void foobar(int, char*);
} mystruct;
и
void mystruct::foobar(int x, char* y) { return; }
и
mystruct obj;
obj.foobar(17, "X");
Все это компилируется, соединяется и работает отлично. За исключением случаев, когда этого не происходит. На одном компиляторе он работает, а на другом компиляторе (Android GCC) он терпит неудачу с ошибкой ссылки: неудовлетворительная ссылка.
Если я меняю его так, он компилирует и связывает.
struct mystruct {
int foo;
int bar;
void foobar(int, char*);
};
Я думаю, что я знаю, почему, но я не могу объяснить это правильно, и я не могу найти его в стандарте. Может ли кто-нибудь объяснить это мне и найти правильную ссылку?
Изменить: я думал, что всем было очевидно, что это код на С++. Я отметил его; функция в структуре недействительна C; но просто чтобы быть ясным, файл имеет расширение CPP, а компилятор рассматривает его как С++.
Изменить: ответчик заметил, что вызов является литералом и поэтому является константой, но arg не является константой. Это не является критическим фактором, потому что (a) компилятор передал его (b) связанный сбой, независимо от типов аргументов.
Изменить: Моя теория заключалась в том, что это связано с анонимными типами структуры, переданными компоновщику, так что декларация и вызов, скомпилированные отдельно, не совпадают. Кажется, это может быть неверно, и в этом случае это может быть просто тонкая ошибка компилятора.
Изменить: из любопытства, может ли кто-нибудь воспроизвести это поведение? Фактический компилятор - Android NDK, недавняя загрузка и любая версия GCC. Если у других компиляторов есть/нет этой проблемы, это может быть ответ.