Типичным объявлением переменной является
extern int x;
. Поскольку это только объявление, требуется одно определение. Соответствующим определением будет:
int x;
Например, следующее генерирует ошибку:
extern int x;
int main()
{
x = 0;
}
//int x; // uncomment this line for successful definition
Аналогичные замечания относятся к функциям. Объявление функции без ее определения приводит к ошибке:
void foo(); // declaration only
int main()
{
foo();
}
//void foo() {} //uncomment this line for successful definition
Будьте осторожны, чтобы выполняемая вами функция точно соответствовала той, которую вы объявили. Например, у вас могут быть несогласованные cv-квалификаторы:
void foo(int& x);
int main()
{
int x;
foo(x);
}
void foo(const int& x) {} //different function, doesn't provide a definition
//for void foo(int& x)
Другие примеры несоответствий включают
Сообщение об ошибке из компилятора часто дает вам полное объявление переменной или функции, которая была объявлена, но не определена. Сравните его с определением, которое вы указали. Убедитесь, что каждая деталь соответствует.
a_horse_with_no_name является правильным.
В PostgreSQL имена без кавычек нечувствительны к регистру. Таким образом, SELECT * FROM hello
и SELECT * FROM HELLO
эквивалентны.
Однако цитируемые имена чувствительны к регистру. SELECT * FROM "hello"
- , а не , эквивалентный SELECT * FROM "HELLO"
.
Чтобы создать «мост» между цитируемыми именами и именами без кавычек, неупомянутые имена неявно ограничены, таким образом hello
, HELLO
и HeLLo
эквивалентны "hello"
, но не "HELLO"
или "HeLLo"
(OOPS!).
Таким образом, при создании объектов (таблицы, представления, процедуры и т. д.) в PostgreSQL, вы должны указать их как без кавычек, так и с кавычками, но с нижним.
Чтобы преобразовать существующие таблицы / представления / etc, вы можете использовать что-то вроде ALTER TABLE "FOO" RENAME TO "foo"
.
Или попробуйте изменить дамп из MSSQL, чтобы сделать его «совместимым с PostgreSQL» (чтобы он содержал foo
s или "foo"
s, но не "FOO"
s).
sed -r 's/"[^"]+"/\L\0/g' dumpfile
- однако следует предупредить, что эта команда также может изменять текст в строковых литералах.)