Это одно из самых запутанных сообщений об ошибках, которые каждый программист VC ++ видел снова и снова. Давайте сначала сделаем чёткость.
A. Что такое символ? Короче говоря, символ - это имя. Это может быть имя переменной, имя функции, имя класса, имя typedef или что-либо кроме тех имен и знаков, которые принадлежат языку C ++. Он определяется пользователем или вводится библиотекой зависимостей (другой пользовательский).
B. Что является внешним? В VC ++ каждый исходный файл (.cpp, .c и т. Д.) Рассматривается как единица перевода, компилятор компилирует по одному модулю за раз и генерирует один объектный файл (.obj) для текущей единицы перевода. (Обратите внимание, что каждый заголовочный файл, включенный в этот исходный файл, будет предварительно обработан и будет рассматриваться как часть этой единицы перевода). Все внутри единицы перевода считается внутренним, все остальное считается внешним. В C ++ вы можете ссылаться на внешний символ, используя ключевые слова, такие как extern
, __declspec (dllimport)
и т. Д.
C. Что такое «решимость»? Resolve - термин времени связывания. Во время компоновки линкер пытается найти внешнее определение для каждого символа в объектных файлах, которые не могут найти свое определение внутри. Объем этого процесса поиска, включая:
Этот процесс поиска называется разрешением.
D. Наконец, почему Unresolved External Symbol? Если компоновщик не может найти внешнее определение для символа, который не имеет определения внутри, он сообщает об ошибке неразрешенного внешнего символа.
E. Возможные причины LNK2019: ошибка неразрешенного внешнего символа. Мы уже знаем, что эта ошибка связана с тем, что компоновщик не смог найти определение внешних символов, возможные причины могут быть отсортированы как:
Например, если у нас есть функция foo, определенная в a.cpp:
int foo()
{
return 0;
}
В b.cpp мы хотим вызвать функцию foo, поэтому добавим
void foo();
, чтобы объявить функцию foo () и вызвать ее в другом теле функции, скажем bar()
:
void bar()
{
foo();
}
Теперь, когда вы создаете этот код, вы получите ошибку LNK2019, жалуясь, что foo является неразрешенным символом , В этом случае мы знаем, что foo () имеет свое определение в a.cpp, но отличается от того, которое мы вызываем (другое возвращаемое значение). Это означает, что определение существует.
Если мы хотим вызвать некоторые функции в библиотеке, но библиотека импорта не добавлен в дополнительный список зависимостей (установленный из: Project | Properties | Configuration Properties | Linker | Input | Additional Dependency
) вашего проекта. Теперь компоновщик сообщит LNK2019, поскольку определение не существует в текущей области поиска.
Предположительно, вы раскалываете "|"
во втором случае, а |
имеет особое значение в регулярных выражениях. Если вы хотите разделить фактический символ трубы, вам следует избегать этого:
String[] bits = whole.split(Pattern.quote("|"));
Pipe - специальный символ регулярного выражения, который означает OR
, если вы хотите разделить по каналу, а затем вывести его в ваше регулярное выражение:
String[] strbuf = str.split("\\|");
ИЛИ
String[] strbuf = str.split("[|]");
str.split("|");
означает что-то другое. String#split
использует regex , а |
- метасимвол, поэтому строка означает: отделить пустую строку или от пустой строки. Вот почему ваша строка делится на каждый символ.
Есть несколько способов делать то, что вы ожидаете (использовать их как строку для разделения):
"\\|"
Это означает, что для избежания метасимвола.
"[|]"
Помещает метасимвол в класс символов.
"\\Q|\\E"
Помещает метасимвол в цитату
Это метасимвол. Удалите его с помощью обратного слэша, например: "\\|"
Труба имеет различное значение в регулярном выражении, поэтому, если вы хотите ее использовать, вам нужно избежать специального символа.
str.split("\\|");
split принимает в качестве входного выражения регулярное выражение. Труба является специальным символом для регулярного выражения, поэтому, если вы хотите использовать его, вам нужно избежать специального символа. Ther - несколько решений:
Вам нужно избежать символа «pipe»
str.split("\\|");
Или вы можете использовать вспомогательную цитату:
str.split(Regexp.quote("|"))
Или между sqares:
str.split("[|]");
Unescaped |
анализируется как регулярное выражение, означающее «пустая строка или пустая строка», поэтому используйте
str.split("\\|");
|
со специальным значением OR в regex