Номер строки C/C++

Вы можете попытаться узнать, какая форма была отправлена, добавив атрибут name к кнопкам:

<button class="btn btn-outline-info" type="submit" name="save_changes">Save changes</button>
...
<button class="btn btn-danger" type="submit" name="delete">Delete</button>

Затем, на ваш взгляд:

if request.method == 'POST': 
    if 'save_changes' in request.POST: # handle editing form
        user_CreditCardForm = CreditCardForm(request.POST, instance=currentCreditCard)

        if user_CreditCardForm.is_valid():
        ...
    elif 'delete' in request.POST: # handle deleting
        ...

Таким образом, когда вы удаляете вы не попадете на if user_CreditCardForm.is_valid():, которая вызывает проблему.

102
задан Brian Tompsett - 汤莱恩 24 February 2016 в 17:33
поделиться

6 ответов

Вы должны использовать макросы препроцессора __LINE__ и __FILE__. Они являются предопределенными макросами и частью стандарта C/C++. Во время препроцессирования они заменяются соответственно на константную строку, содержащую целое число, представляющее номер текущей строки, и на имя текущего файла.

Другие переменные препроцессора :

  • __func__ : имя функции (это часть C99, не все компиляторы C++ поддерживают его)
  • __DATE__ : строка вида "Mmm dd yyyy"
  • __TIME__ : строка вида "hh:mm:ss"

Ваш код будет :

if(!Logical)
  printf("Not logical value at line number %d in file %s\n", __LINE__, __FILE__);
166
ответ дан 24 November 2019 в 04:27
поделиться

C++ 20 предложений новый способ достигнуть этого при помощи станд.:: source_location. Это в настоящее время доступно в как std::experimental::source_location.

проблема с макросами как __LINE__ состоит в том, что, если Вы хотите создать a, например, регистрирующаяся функция, которая производит текущий номер строки наряду с сообщением, Вы всегда, должна передавать __LINE__ как аргумент функции, потому что это расширено на сайте вызова. Что-то вроде этого:

void log(const std::string msg) {
    std::cout << __LINE__ << " " << msg << std::endl;
}

будет всегда производить строку объявления функции а не строку, где log был на самом деле назван. С другой стороны, с std::source_location можно записать что-то вроде этого:

void log(const std::string msg,
  const std::source_location loc = std::experimental::source_location::current()) {
    std::cout << loc.line() << " " << msg << std::endl;
}

Здесь, loc инициализируется с номером строки, указывающим на местоположение, где log был назван.

0
ответ дан 24 November 2019 в 04:27
поделиться

Попробуйте __ FILE __ и __ LINE __ .
Вам также могут пригодиться __ DATE __ и __ TIME __ .
Хотя, если вам не нужно отлаживать программу на стороне клиента и, следовательно, регистрировать эту информацию, вам следует использовать обычную отладку.

4
ответ дан 24 November 2019 в 04:27
поделиться

В рамках стандарта C++ существуют некоторые предопределенные макросы, которые вы можете использовать. Раздел 16.8 стандарта C++ определяет, среди прочего, макрос __LINE__.

__LINE__: Номер строки текущего исходного текста (десятичная константа). константа).
__FILE__: Предполагаемое имя исходного файла (символьный строковый литерал).
__DATE__: Дата перевода исходного файла (литерал символьной строки литерал...)
__TIME__: Время перевода исходного файла (символьная строка литерал...)
__STDC__: Является ли__STDC__ предопределенным
__cplusplus: Имя __cplusplus определяется значением 199711L при компиляции блока трансляции C ++

Таким образом, ваш код будет выглядеть так:

if(!Logical)
  printf("Not logical value at line number %d \n",__LINE__);
62
ответ дан 24 November 2019 в 04:27
поделиться

Используйте __LINE__ (это double-underscore LINE double-underscore), препроцессор заменит его на номер строки, на которой он встречается.

11
ответ дан 24 November 2019 в 04:27
поделиться

Checkout __FILE__ и __LINE__ макросы

9
ответ дан 24 November 2019 в 04:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: