こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

プリプロセッサ#ifdef~#endifについて

C言語のプリプロセッサ#ifdef~#endifを使用して以下のソースファイルを作成しました。コンパイルするとエラーになります。

(pre.c)***********************
/* 各行の頭は行番号を表しています。*/
/* 実際のソースには記述していません。 */
1: #include <stdio.h>
2:
3: #define TAB 0x61
4: #ifdef TAB
5: printf("%c", TAB);
6: #endif
7:
8: int main(void) {
9: return 0;
10: }
******************************

C:\>cl pre.c
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86 Copyright (C) Microsoft Corporation. All rights reserved.

pre.c
pre.c(5) : error C2143: 構文エラー : ')' が '文字列' の前にありません。
pre.c(5) : error C2143: 構文エラー : '{' が '文字列' の前にありません。
pre.c(5) : error C2059: 構文エラー : '<不明>'
pre.c(5) : error C2059: 構文エラー : ')'


原因について、どなたか教えて頂けませんでしょうか?

投稿日時 - 2008-10-23 07:52:38

QNo.4422826

すぐに回答ほしいです

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

#include <stdio.h>
#define TAB 0x61

int main(void) {
#ifdef TAB
printf("%c", TAB);
#endif
return 0;
}

main関数の中に移動しましょう

投稿日時 - 2008-10-23 10:11:43

お礼

ご回答ありがとうございました。
解決しました。

投稿日時 - 2008-11-03 15:15:12

ANo.3

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

5行目が原因です。#define と #ifdefにより、5行目が実行されます
が、このグローバル領域に式を書くことはできません。

以下、人間が見やすいように実行時の解釈にフィルタリングしてみまし
た。

1: #include <stdio.h>
2:
5: printf("%c", TAB);
7:
8: int main(void) {
9: return 0;
10: }

投稿日時 - 2008-10-23 09:51:40

お礼

ご回答ありがとうございました。
解決しました。

投稿日時 - 2008-11-03 15:16:37

ANo.1

このエラーはTABが定義されたため printf( "%c", 0x61 ); という文が関数定義だろうとコンパイラが仮定してコンパイルを試みたものの文法的におかしな構文になっているので『エラーです』と報告されているのでしょう

関数定義なら
戻りの型 関数名( 仮引数群 );
といった部分が必要です

ですが printf("%c",0x61); では
戻りの型は無し ... 必ずしも必要ではない
関数名は printf
仮引数は "%c" と 0x61
普通仮引数は 引数の型 + 引数の名前 といった構造だがこれにあっていない
などの理由でしょう

投稿日時 - 2008-10-23 08:38:30

お礼

ご回答ありがとうございました。

投稿日時 - 2008-11-03 15:15:45

あなたにオススメの質問