• ベストアンサー

C/C++ の __LINE__ マクロを文字列化する方法

C/C++ プリプロセッサの定義済みマクロ __LINE__ の数値を 文字列化する方法がわかる方、いますか ? # 演算子(マクロ?)を使ってもだめでした。 そもそも不可能なのでしょうか ? printf("%d\n", __LINE__); // 行番号(数値) : OK #define tostr(n) # n printf("%s\n", tostr(__LINE__); // 文字列化して表示 : NG # 「意味がない」という回答はカンベンしてください.。

質問者が選んだベストアンサー

  • ベストアンサー
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

こんな感じでしょうか? #define tostr(n) tostr_(n) #define tostr_(n) #n printf("%s\n", tostr(__LINE__)); VC++で/ZIオプションを付けた場合には、 "(__LINE__Var+行番号)" という文字列になるので注意してください。

z64423
質問者

お礼

gcc でためしてみました。 確かに文字列になってますね。 何故 #define を 2段にしないといけないのかが ?? てすが、可能だということがわかりました。 どうもありがとうございました。

その他の回答 (2)

  • nitscape
  • ベストアンサー率30% (275/909)
回答No.2

CAtlString str; str.Format("%d",__LINE__); やsprintf(psz,"%d",__LINE__); のようにしてはどうでしょうか?

  • alicia-y
  • ベストアンサー率40% (85/208)
回答No.1

char s[100]; sprintf(s, "%d", __LINE__); とかですかね。

z64423
質問者

補足

ちょっと質問がまずかったようです。 「C/C++ のプリプロセッサ」だけで (#define 等だけで)可能かどうかという意味です。 つまり、VC++ なら /P オプション、gcc なら -E オプション (どちらもうろ覚えですが)で プリプロセッサだけを動かして出力ファイル (*.i) を得た時点で __LINE__ を文字列にできるか、ということです。

関連するQ&A

  • defineで定数が置き換えられない?(C言語)

    #defineについて質問です。 #defineは、ソースコード内にこの文字を見つけたら、コンパイルする前にこの文字をこの定数に置き換えて、というプリプロセッサですよね?だから、printfで#defineで定義した定数を出力する場合で、変換指定が必要ない場合は #include <stdio.h> #define DEF 100 void main(){ printf("#defineで定義された定数はDEFです"); } でもいいと思うんです。ですがこのソースコードは間違いで、実行結果は #defineで定義された定数はDEFです(←置き換えられてない) となってしまします。プリプロセッサだけ実行しても、DEFは100に置き換えられずそのままです。printfで#defineで定義した定数を出力させたい場合は書式指定をしなければなりません。なぜ、このような場合は#defineで定義した定数は置き換えられないのでしょうか?回答よろしくお願いします。

  • マクロの展開

    #define A(str) str\n #define B(str) #str #define C(str) printf(B(A(str)); int main() { C(hello) } をプリプロセスすると入れ子になったマクロAが展開されずに  printf("A(hello)"); となってしまいます。  printf("hello\n"); と展開されるようにするにはどうしたらいいでしょうか?  よろしくお願いします。  

  • C言語でファイルから特定の文字を抽出

    現在C言語でプログラム開発しています。 文字列が並んだテキストファイルから特定の部分のみを抽出したいのですが、うまくいきません。 お力を貸していただけないでしょうか。 テキストファイルの構造はこんな感じです。 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー 文字列 文字列 文字列badresult=*****文字列badresult=*****文字列badresult=*****文字列result=***** ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー これが10セット程記述されたファイルです。 ここから全てのbadresultの数値とresultの数値を抽出したいのです。 私が現段階で作成したプログラムがこちらです。 #include <stdio.h> #include <string.h> #include <stdlib.h> #define MAXLINE 2084 int main(void){ FILE *fp; char line[MAXLINE]; char s1[]="badresult"; char s2[]="result="; char *r; if ((fp = fopen( "テキストファイルへのダイレクトパス", "r" )) == NULL){ printf("エラーメッセージB\n"); exit(1); } while (fgets(line, MAXLINE, fp) != NULL){ if(strstr(line,s1)!=NULL){ printf("%.27s",strstr(line, s1),"\n"); printf(" "); printf(strstr(line, s2)); } } } ですがこれだと1行に全てのbadresultが含まれているため、結果は ----------------------------- badresult=***** result=****** ----------------------------- とbadresultは1つしか出てきません。 strstrのポインタをどうにかできないかと考えたのですが、 私のC言語の知識も浅いためなかなかうまくできません。 Cプログラミングに精通している方、どうか改善策を教えていただけないでしょうか。 できればなるべく簡単な方法ですと助かります。

  • c言語 文字列の比較

    ファイルから読み込んだ文字列と入力した文字列を比較して同じなら次の処理を行いたいんですが、入力が例えば同じ1212でもstrcmp()で181がかえってきます。原因は何なのでしょうか? #define BUFMAX=45;  char smsg[BUFMAX];  char pass[BUFMAX];  printf("pass=%s\n",pass); printf("smsg=%s\n",smsg); c=smsg; stc=strcmp(pass,c); passにはscanfで1212を読み込みます。 smsgにはfgetsでファイルから一行読み込みます。 テキストのなかみは1212が一行はいっています。 自分では全く見当がつかないので、回答していただける方がいれば、ヒントでもいいのでお願いします。

  • c言語 文字列と配列

    #include<stdio.h> int charlen(int n); void cap2sml(int b); int main() { char a[100],b[100]; int n,i; /*Input CARACTERS*/ printf("CAPITAL?\n"); fgets(a,100,stdin); charlen(n); printf("total cahrs=%d\n",n); //printf in main cap2sml(i); printf("small=%s\n",b); return(0); int charlen(int n) n=0; while(1){ if(a[n]=='\0') break; n++; } void cap2sml(int b) int i; for(i=0;a[i]!='\0';i++){ b[i]=a[i]+0x20; } b[i]='\0' } のプログラムでエラーがでるのですが、どこを直せばよいでしょうか? ユーザー関数を使い文字列(大文字)を入力したときの文字列の長さと大文字を小文字に変化するプログラムです

  • C言語 クロージャマクロの読み方

    #include <stdio.h> #define APPLY(type, closure, arg) (type)(&(closure), arg) #define APPLY_COUNTER(c, a) APPLY (((int (*)(Counter *, int))((c).func)), c, a) // <= #define MAKE_COUNTER(k) {k, counter_function}; typedef struct{ int n; void* func; }Counter; int counter_function (Counter * c, int a){ return c->n += a; } int main (void){ Counter c1 = MAKE_COUNTER (0); Counter c2 = MAKE_COUNTER (5); printf ("%d\n", APPLY_COUNTER (c1, 3)); /* => 3 */ printf ("%d\n", APPLY_COUNTER (c2, 1)); /* => 6 */ printf ("%d\n", APPLY_COUNTER (c1, 2)); /* => 5 */ printf ("%d\n", APPLY_COUNTER (c1, 8)); /* => 13 */ printf ("%d\n", APPLY_COUNTER (c2, 9)); /* => 15 */ } #define APPLY_COUNTER ここの APPLY への値渡しが読み解けません 詳しい方、教えてください

  • 文字列

    下のプログラムは何をするためのプログラムなのか教えてください。 個人的にはJISコードに関係していると思うのですがさっぱりわかりません。 どなたか詳しい説明お願いします。 #include <stdio.h> #define LEN 255 int main(void) { char str[LEN]; char cipher[LEN]; int ikey; int i,n; printf("文字列を入力せよ : "); scanf("%s", str); printf("鍵を入力 : "); scanf("%d", &ikey); i = 0; while (str[i]!='\0') { n = (str[i]-'A'+ikey)%26; cipher[i] = 'A'+n; ++i; } cipher[i] = '\0'; printf("%s\n", cipher); return 0; }

  • 文字列配列のほしい部分だけを抜き出して数値にする方法(PIC)

    現在PICマイコンでPCからGPSの座標データを取得し,そのデータ列から必要な部分だけ抜き出す処理をくんでいるんですがうまくいきません。 pcとマイコンの接続はrs23-2c コンパイラはccsc pic:16f877 GPSデータ↓ @051125012151N3529558E13638533G009+00021E0000N0000D0003 このデータのN以降の「3529558」とE以降の「13638533」の文字列を数値にしたい。 delay_ms(300); output_b(0b00000001);//デバック用LED点灯 delay_ms(300); gets(mes);    //ここでGPSデータをmesに代入する output_b(0b00000011); len_N=0; for(i=0;i<58;i++){  if(mes[i]=='N'){   len_N=i;   break;  } } printf("\r\n"); n=atoi(mes[len_N+1]); //ここで試しに一文字分だけ数値にする処理を行ったが処理が停止する。 printf("n:%ld",n); アドバイスお願いします

  • 文字列から文字を探す

    以下のプログラムです。 #include <stdio.h> main () { char s[]="I love cat and dog."; char c='a'; char *p=s; int n=0; printf("\"%s\"の中から\'%c\'を探します。",s,c); while(*p != '\0') { if(*p == 0) { printf("%d文字目で発見しました。\n",p-s+1); n++; } p++; } if(n == 0) printf("1つも見つかりませんでした。\n"); else printf("全部で%d個見つかりました。\n",n); } C言語の本で勉強しています。 ・p-s+1の意味がわかりません。 ここには何が割り当てられているのでしょうか? ・*pとpの違いもあいまいです。 ・\"%s\"は「"」を印刷するためには必要なのでしょうか? どう質問していいのかもわからないのですが、よろしくお願いします。

  • c言語の文字列出力

    プログラミング超初心者です サイトで文字列の出力について調べていたところ c言語は変数に文字列を代入することができないのでstrcpy関数を使い以下のようにするとあります char s[5]; strcpy(s, "ABCDE"); printf("%s\n", s); ところが他のサイトでは以下のように説明しています char s[5] = "ABCDE"; printf("%s\n", s); 明らかに後者の方が簡単で良いように見えるのですが違いはなんですか? あと、文字列の配列の指定?の[5]の部分なのですが 数字を記載しているところがほとんどですが省略しているところも有ります どんな文字列が入るかわからない場合もありますがここは省略しない方が良いのですか? よろしくお願いします

専門家に質問してみよう