• ベストアンサー

プリプロセッサ#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: 構文エラー : ')' 原因について、どなたか教えて頂けませんでしょうか?

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

  • ベストアンサー
  • php504
  • ベストアンサー率42% (926/2160)
回答No.3

#include <stdio.h> #define TAB 0x61 int main(void) { #ifdef TAB printf("%c", TAB); #endif return 0; } main関数の中に移動しましょう

masy0312
質問者

お礼

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

その他の回答 (2)

  • stakezo
  • ベストアンサー率40% (2/5)
回答No.2

5行目が原因です。#define と #ifdefにより、5行目が実行されます が、このグローバル領域に式を書くことはできません。 以下、人間が見やすいように実行時の解釈にフィルタリングしてみまし た。 1: #include <stdio.h> 2: 5: printf("%c", TAB); 7: 8: int main(void) { 9: return 0; 10: }

masy0312
質問者

お礼

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

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

このエラーはTABが定義されたため printf( "%c", 0x61 ); という文が関数定義だろうとコンパイラが仮定してコンパイルを試みたものの文法的におかしな構文になっているので『エラーです』と報告されているのでしょう 関数定義なら 戻りの型 関数名( 仮引数群 ); といった部分が必要です ですが printf("%c",0x61); では 戻りの型は無し ... 必ずしも必要ではない 関数名は printf 仮引数は "%c" と 0x61 普通仮引数は 引数の型 + 引数の名前 といった構造だがこれにあっていない などの理由でしょう

masy0312
質問者

お礼

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

関連するQ&A