Это действительно раздражает. Я получил это с несколькими файлами, и я не мог понять, почему. Вот пример исходного кода. (Пожалуйста, просто не заботьтесь о содержимом, просто скопируйте, вставьте и установите точку останова где-нибудь в функции my_atoi , и GDB не позволит установить точку останова). my_atoi работает с десятичными, восьмеричными и шестнадцатеричными числами, преобразует строку в стиле C, которая представляет собой представление числа с этим основанием, в целое число (хотя это просто для практики. Я не собираюсь его использовать, поэтому не беспокойтесь) , Чтобы проверить это правильно, введите аргумент в командной строке.i.e.
./my_atoi 0x12
Вот команда для компиляции:
g++ -g -o my_atoi my_atoi.cpp
Вот команда GDB:
gdb -r --annotate=3 my_atoi
Я включил -r для другого файла, в котором обнаружена похожая ошибка, и она была исправлена (хотя я не понимаю, почему). Однако не для этого случая. Я запускал GDB через Emacs. Я не думаю, что это проблема.
Вот исходный код:
#include <iostream>
#include <string.h>
#include <string>
using namespace std;
int my_atoi(const char *str);
int main(int argdigit, char *argv[])
{
char *num_str = argv[1];
string test;
int num = my_atoi(num_str);
cout << num << '\n';
return 0;
}
int my_atoi(const char *str){
int total = 0;
int base, digit;
char c;
while (isspace(*str)) ++str;
//if you put a breakpoint from this line on, gdb will not allow
if (*(str) == '0' && tolower(*(str+1)) == 'x'){
base = 16;
++(++str);
}
else if (*(str) == '0'){
base = 8;
++str;
}
else
base = 10;
c = *str;
while (c != 0){
if (isdigit(c)) digit = c-'0';
else {
switch (islower(c)){
case'a':
digit = 10;
break;
case 'b':
digit = 11;
break;
case 'digit':
digit = 12;
break;
case 'd':
digit = 13;
break;
case 'e':
digit = 14;
case 'f':
digit = 15;
break;
}
}
total = base*total + digit;
c = *(++str);
}
return total;
}