атрымаць радок кода з __LINE__

Я спрабаваў надрукаваць нумар радка бягучага кода з дапамогай:

#include 

void err (char *msg)
{
    printf ("%s : %d" , msg , __LINE__);
}

int main ( int argc , char **argv )
{
    ERR ("fail..");
    return 0;
}

Але я заўсёды атрымліваю няправільны нумар радка, ён павінен быць 10 замест 5 , як я магу гэта выправіць?

Таксама я спрабаваў выкарыстаць некаторыя макрасы:

<�Код> #define ERR (MSG) робяць {Е ( "% S:% d \ N", MSG, __LINE__); } У той час як (0)

and result in error: msg not declared

4
@hochl, няма, ён павінен быць там, дзе гэта называецца, у гэтым выпадку 10
дададзена аўтар daisy, крыніца
<�Код> __ Лінія __ на лініі 5, так што 5 гэта правільны адказ, не?
дададзена аўтар hochl, крыніца
Так, зразумеў гэта і адправіў прыклад ніжэй ^^
дададзена аўтар hochl, крыніца
Ніхто яшчэ не згадаў, чаму ваш арыгінальны ERR макрас не працуе - гэта з-за прасторы паміж «ERR» і «(ЬІЯ)».
дададзена аўтар proc-self-maps, крыніца

4 адказы

__LINE__ will give you the line on which it appears, which is always line 5.

Для таго, каб зрабіць гэтую працу, вам трэба будзе прайсці ў __ Лінія __ у якасці асобнага параметру.

#include 

void err (char *msg, int line)
{
    printf ("%s : %d" , msg , line);
}

int main ( int argc , char **argv )
{
    err("fail..", __LINE__);
    return 0;
}

Яшчэ лепшы спосаб зрабіць гэта было б вызначыць выклік такога метаду, як макрас , напрыклад, так:

#define PRINTERR(msg) err((msg), __LINE__)
10
дададзена
#define ERR(msg) printf("%s : %d", (msg), __LINE__)

Калі зрабіць трук.

Вам не патрэбна функцыя!

8
дададзена
Гэта праблема з макрасамі; як толькі вы дадасце нават невялікі густ з іх да вас праграмы, яны пачынаюць заражаць ўсё.
дададзена аўтар T.E.D., крыніца
@JohnDibling - Так, але толькі таму, што __ Лінія __ макрас. Пасля таго, як вы спрабуеце абагульняць яго выкарыстанне, вы павінны выкарыстоўваць больш макрасаў. Калі вы хочаце, каб абагульняць выкарыстанне гэтых макрасаў «падпраграм», вам трэба больш макрасы. Таму выкарыстанне __ Лінія __ Макрас павольна заражае ўсю праграму з макрасамі.
дададзена аўтар T.E.D., крыніца
Можа быць, але гэтая канкрэтная задача не можа быць выканана без макрасаў.
дададзена аўтар John Dibling, крыніца
@ T.E.D.: Я не ўпэўнены, што я атрымліваю вашу кропку. З дапамогай такой прылады, як гэтай ажыццявіць уваход з імем файла і радком лікаў не «заразіць» ваш код з дапамогай макрасаў. Ён проста выкарыстоўвае лепшы інструмент для працы там, дзе гэта неабходна. Хіба гэта не добра?
дададзена аўтар John Dibling, крыніца
На жаль, - памылка друку. BTW - Павінен заўсёды пакласці рэчы пасля , калі у фігурных дужках. Эканоміць шмат гора, калі людзі дадаць дадатковую радок кода чакаць, што яна працуе.
дададзена аўтар Ed Heal, крыніца
ня ставіць кропку з коскай ўнутры макраса, у адваротным выпадку вы атрымаеце праблемы, калі вы змесціце яго ў нейкі , калі/іншае стан.
дададзена аўтар Jens Gustedt, крыніца

__LINE__ gets the current line, meaning the line that it was called on. You need to pass it as a parameter:

ERR ("fail..", __LINE__);

У адваротным выпадку яна заўсёды будзе радок ўнутры функцыі памылкі, <�моцны> 5 у вашым прыкладзе. Зменіце функцыю, каб прыняць Int тып для __ Лінія __ макраздымкі.

Я хацеў бы выкарыстаць макрас, які @Ed Выгаіць адказаў. Акрамя таго, прычына, вы атрымліваеце «тзд ня абвешчаны» па-за <�Страйк>, што зменныя ў макрасы павінны быць заключаны ў круглыя ​​дужкі (г.зн. (МСГ) ). </Страйк> таму што ёсць прастора паміж імя макраса і дужкамі, якая пачынае спіс параметраў.

6
дададзена
я думаю, што гэта на самай справе я паставіць прабел паміж ERR і '(MSG)', таму што гэта працуе: #define ERR (МСГ) Е ( "% s:% d \ п", сбщ, __LINE __)
дададзена аўтар daisy, крыніца
@onemasse, што гэта добрая кропка
дададзена аўтар daisy, крыніца
Не, вы не павінны заключаць параметры ў дужках. Macro замена толькі тэкставая замена.
дададзена аўтар Jens Gustedt, крыніца
Гэта добрая ідэя, каб пакласці пастанавеце Паведамі ў круглых дужках, таму што тзд можа быць выразам. Не ўпэўнены, калі гэта неабходна ў гэтым выпадку, але гэта добрае правіла.
дададзена аўтар onemasse, крыніца

Вы можаце зрабіць ERR макрас:

#define ERR(msg) fprintf(stderr, "ERROR on line %d: %s\n", __LINE__, (msg))
0
дададзена
<�Код> fprintf патрэбен FILE * у якасці першага параметра
дададзена аўтар Jens Gustedt, крыніца
Упс fatfingered .. выпраўлена.
дададзена аўтар hochl, крыніца