• ベストアンサー

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

S117の回答

  • ベストアンサー
  • S117
  • ベストアンサー率40% (18/45)
回答No.5

「なぜ置き換えられないのか」について説明しましょう。 マクロが置き換えるのは、文字の並びではなく、トークンになります。 どういうことかというと、 #define DEF 100 とした場合、 DEFINE は「DEFINE」のままで「100INE」にはなりません。 置き換えできるのは「DEF」という文字の並びが前後と区切られているときだけです。 ここでトークンについて説明しましょう。一言で言うなら、記号や識別子などのプログラムの最小構成要素です。自然言語で言うなら、単語や句読点です。 sum=a+b; という一行のソースコードはトークンに分解すると、以下のようになります。 sum = a + b ; この段階ではそれが変数なのか、関数なのか、演算子なのかは考慮されていません。全部「トークン」です。 printf("#defineで定義された定数はDEFです"); この部分は以下のようなトークンに分解されるでしょう。 printf ( "#defineで定義された定数はDEFです" ) ; 文字列リテラルはそのままトークンになります。DEFというトークンが存在しないことがわかります。これでは置換できないのも当然です。 この辺の挙動は参考URLのWikipedia -コンパイラの3.1フロントエンドも参考にしてください。 なお、文字の並びを置換しない理由ですが、単純な置換よりもトークン単位の方が役に立つからです。冒頭のように「DEF」というマクロで「DEFINE」の一部が置換されるといやですよね。

参考URL:
http://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9
noname#113783
質問者

お礼

詳しい・・・! 確かにトークンにしないと不便ですね。 トークンがないとソースももっと正確に書かないといけなくなりますし、便利ですねトークン。

関連するQ&A

  • printfの出力内の文字をdefineしたい

    defineで定義した内容をprintfしたいのですが、どうすればいいですか? 次のようなコードを書きましたがコンパイルが通りませんでした。 #define ALP2 B int main(){ printf("A"ALP2"C"); return 0; } 上記のコードで「ABC」という出力を得たいです。 できれば変数に代入してから出力というのは避けたいので、それ以外の方法がありましたら教えてください。

  • #defineで置き換えられない

    C言語です。詳しい方、よろしくお願いします。 下記のプログラムをコンパイルして実行したら、画像のようになってしまいます。 コンパイラは、CPad for LSI C-86 ver2.31です。 #include<stdio.h> #define clr() printf("\x1b[2J") void main(void) { while(1){ clr(); printf("test"); } } #defineがどうも置き換えられていないようです。 詳しい方、考えられる原因を教えてください。 よろしくお願いします。

  • #defineの定数を文字列として読み込む

    #define A "xxx" #define B "yyy" と定義しておいて scanf("%s", str) で読み込んだ文字列strが "xxx"だった場合、"yyy"だった場合のように分岐したいのですが このとき if(str == "xxx") のように中身を指定するのではなく if(str == AA) のように定数で分岐させることってできますか? 上記のままではできませんが、何か特別な関数とかでできるのでしょうか?

  • C言語 コンパイルエラー(文字列または文字定数が閉じていない)

    下記コードでコンパイルすると、コンパイルエラーとなります。試しに、"さようなら"を、"さような"に変更すると、コンパイルエラーは なくなります。どうして、コンパイルエラーとなるのか分からずに困っています。ちなみに、コンパイラは、ボーランドのものを使っています。 ▼エラーとなるコード #include <stdio.h> int main(void) { printf("こんにちは"); printf("さようなら"); return 0; } ▼コンパイルエラー内容 エラー E2380 sample08.c 7: 文字列または文字定数が閉じていない(関数 main ) エラー E2121 sample08.c 9: 関数呼び出しに ) がない(関数 main ) 警告 W8070 sample08.c 10: 関数は値を返すべき(関数 main )

  • C言語について

    #include <stdio.h> int main(void) { printf("123456\tABC DEFGHIJK\n"); printf("2006/4/14\n"); printf("programing\n"); } のprintfをすべてputsに書き換えてコンパイル・実行すると、 #include <stdio.h> int main(void) { puts("123456\tABC DEFGHIJK\n"); puts("2006/4/14\n"); puts("programing\n"); } になると思うんですけど、そのputsを用いて上のprintfを用いたプログラムと同じ出力を得るにはどのようなプログラムに変えればいいのでしょうか?

  • c言語の問題

    以下のプログラムをコンパイルし、実行したところ、次のような画面が表示された。下記の関数定義部分を補いなさい。 gcc test.c ./a.out abc def answer = defabc 以下ソースコード #include<stdio.h> void stradd(char A[], char B[]); int main(){ char str1[100], str2[100]; scanf("%s", str1); scanf("%s", str2); stradd(str1, str2); printf("answer = %s\n", str2); } void stradd(char A[], char B[]){ } よろしくお願いします。

  • defineで範囲指定した文字配列について

    こんにちは。C言語初心者です。 文字の配列で下のようなプログラムを作ったとき、入力の際にdefineで指定したN以上の文字数の文字列を入力した場合、その後のプログラム次第で実行が正しかったり、セグメントエラーがでたりします。 コンパイルする際はエラーがでません。 ※その後のプログラムとは、関数strcmpやstrcpyです。 #include <stdio.h> #define N 10 main() { char a[N];   char b[N]; scanf("%s %s", a, b); printf("%s\n", a); printf("%s\n", b); }

  • define で 配列

    #defineで配列を定義したいのですがこのようなことは可能でしょうか? ヘッダファイル(test.h)で #define MAX (2) int A[MAX]={20,30}; ソースファイルで #include <stdio.h> #include "test.h" int main(){ int i; for(i=0;i<MAX;i++){ printf("A[%d]=%d\n",i,A[i]); } return 0; } とやれば出来るのですが、このヘッダファイルを複数のソースで参照すると 多重定義であるとおこられてしまいます。 #defineで #define A[MAX] {20,30} のように配列を定義する方法は存在するのでしょうか? どなたか良い方法を御存じの方、ご教授お願いします。

  • C言語における定数の使用方法

    こんにちは。 今日質問したいのは、タイトルにありますように、C言語における「定数」の使い方についてです。 私は現在、Visual C++を用いてC言語のプログラミングを勉強しているのですが、条件文(if文)に定数を用いてコーディングを行おうとしても、どうしてもエラー表示が出て、うまくコンパイルすることができません。 具体的には、 if(No>=1 && No<=10){ //具体的な処理部分 } というif文を、予めヘッダファイル内にて定義した定数 #define start 1; #define stop 10; を用いて次のように、 if(No>=start && No<=stop){ //具体的な処理部分 } コーディングしたいと考えています。 しかし、これをコンパイルするとエラーが発生してしまいどうにもうまくいきません。 また、定数ではなく数字で記述するとうまく回ります。 別のところで定数を、 wk = start; のように代入で使用しているのですが、そこではなにも問題がありません。 いったい何が間違っているのか、どのようにすればうまくいくのかを教えていただきたいと考え、書き込ませていただきました。 皆様、どうぞよろしくお願いします。

  • C# 定数定義

    c#での定数定義についてですが、定数用のclassを定義したのですが この場合、定数を使用する各classで継承をしなくてはいけないですが、もっといいやり方等があれば教えてください。 public abstract class define { public const short NET_BUFF = 1024; } class testMain:define {     :     :