• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:プリプロセッサのエラー対策がわからない状態)

プリプロセッサのエラー対策がわからない状態

このQ&Aのポイント
  • VS.2005でプログラミングをしている際に、プリプロセッサで起こるエラーの対策が分からない状態です。
  • エラーメッセージは「warning C4067: プリプロセッサ ディレクティブの後に余分な文字がありました - 改行が必要です」です。
  • エラーの改善には、/Zaコンパイラオプションを使用する方法があるようですが、具体的な手順がわかりません。ソースコードも記載しています。

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

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

#ifdef/#ifndef は, 与えられたものが「マクロとして定義されているかどうか」をテストするプリプロセッサ指令です. んで, 例えば #define _TEXT(x) __T(x) というプリプロセッサ指令で定義されているのはあくまで「_TEXT」なんです. これで #1 とつながった.

DEADSPACE566
質問者

お礼

回答ありがとうぎざいます。 プリプロセッサ命令の理解が進みました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

回答No.3

コンパイラが余分な文字があることと その場所まで教えてくれてるのだから、、、 #ifndef _TEXT // _TEXTが定義されていなければ #define _TEXT(x) __T(x) // _TEXTを__Tとして定義する #endif

DEADSPACE566
質問者

お礼

上記のとおりにデバッグを行ったら警告が消えました。 ご指摘ありがとうございます。 多分、この問題は自分のプリプロセッサ命令の理解不足だと思います。

全文を見る
すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

あなたはこの #ifndef で何をしたいのですか? #ifndef がどのような機能を持っているのかわかっていますか?

DEADSPACE566
質問者

お礼

回答ありがとうございます。 実は参考書を読んでそれでプログラムを組んでいます。 しかし、その参考書で必要になるサンプルプログラム内で問題がるようで・・・ その参考書、時々プログラム部分が凡ミスして載せてあるんですよね。 自分はまだプリプロセッサ命令、IDE互換対応、OS互換対応プログラムは末体験なんで困っています。 まぁ、ただの愚痴なんですけどね。

DEADSPACE566
質問者

補足

#ifndef XXXはXXXが定義されていないとその先を実行するというプリプロセッサ 命令だと思います。 #ifndef _TEXT(x)というのは通じないみたいです。 まだ調べていないのですが #ifndef _TEXT(x)←引数付にして宣言するのは駄目 なようですね。 この引数の部分を取り去るとコンパイラが通りました。 単なるプリプロセッサの理解不足のような気がします。

全文を見る
すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

マクロとしては _TEXT じゃないか?

DEADSPACE566
質問者

補足

TEXTじゃなくて_TEXTだということでしょうか? 文ば短いのでよく分からないです。 自分の質問内容は、#ifndef x を#ifndef _TEXT(x)とすると上記の警告がでるのでそれをどうすればいいのか?というこです。 あと題名にエラーとありますが警告でした。 すみません。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

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

  • DirectX開発中のinclude ファイルを開けません。

    DirectX開発中に c:\documents and settings\a022\my documents\visual studio 2008\projects\map\map\stdafx.h(10) : fatal error C1083: include ファイルを開けません。'WinLib.h': No such file or directory MapModel.cpp 上のソースコードは、 #ifdef _MSC_VER // 警告の抑制 #pragma warning(disable: 4201) #pragma warning(disable: 4100) #pragma warning(disable: 4786) #endif #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x400 #endif #include <WinLib.h> ←ここがよめないらしい というエラーが出ます。 解決法がわかる方はお教えください。

  • (msvcr71d.dll) でハンドルされていない例外が発生しました

    Visual C++ を勉強しだした Windowsプログラム初心者です。 ある参考書のサンプルで、メールスロットを利用したメッセッンジャー体験プログラムがあります。 このプログラム一つで、クライアントとサーバーを実感する為のもので、ダイアログボックスだけで出来ています。 デバック実行で、画像にある[送信]ボタンを押すと、 「Mailslot.exe の 0x1021471c (msvcr71d.dll) でハンドルされていない例外が発生しました : 0xC0000005: 場所 0x00000015 を読み込み中にアクセス違反が発生しました。 。」 とエラーボックスが出ます。 原因は パソコンのOSのバージョンなのか、何か足りないライブラリなのか?切り分け所がわからなくて困っています。 どなたか良いアドバイスをお願いします。 OS : Vista Home Premium IDE: Visual C++.net スタンダード version 2003 因みに、stdafx.h の内容は↓です。 #pragma once #ifndef VC_EXTRALEAN #define VC_EXTRALEAN #endif #ifndef WINVER #define WINVER 0x0501 #endif #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0400 #endif #ifndef _WIN32_WINDOWS #define _WIN32_WINDOWS 0x0410 #endif #ifndef _WIN32_IE #define _WIN32_IE 0x0400 #endif #define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // 一般的で無視しても安全な MFC の警告メッセージの一部の非表示を解除します。 #define _AFX_ALL_WARNINGS #include <afxwin.h> #include <afxext.h> #include <afxdisp.h> #include <afxdtctl.h> #ifndef _AFX_NO_AFXCMN_SUPPORT #include <afxcmn.h> #endif #include <Lmcons.h>

  • プリプロセッサの上手な使い方を教えて下さい

    美しいソースを書けるようになりたくて日々自分のソースを見直しています。現在C言語を学習していますが基本的に独学なので、猛者な方々のご意見を伺いたいと思っています。 現在書いているプログラムが大規模になってしまったので、ソースを分割しまして、メイクファイルも作りました。何か条件を与えてそこからインクルードするファイルを選択したい、また静的にパラメータも与えたいというような場合、一般にどのようにするのが上手い方法なのか教えて頂きたく思います。メイクファイル、パラメータ用のヘッダファイル、ソースファイルの3つをそれぞれ下のように書いたんですが、一般にこういう書き方をしますでしょうか?自信が持てないでいます。猛者な方々のご意見をお待ちしています。長いソースのようですが、処理以前の問題です。よろしくお願いします。 パラメータして与えたいのは、 PBLOCK_PER_TBLOCK GRAINSIZE インクルードするファイルそのもの になります。これらは全てメイクファイルで設定するのが自然ですか?それともヘッダファイルで設定するものなのでしょうか?その場合、文字マクロもヘッダファイルで設定するものなのでしょうか? でも、ヘッダファイルで、 #define __KERNEL_SOA__ などと書いているのを見かけないと思うのですが。。。 //========================= メイクファイル ====================== ########### Please select encoding type ########### NFLAG = -D __KERNEL_AOS__ -D GRAINSIZE16 -D __USEDEVICE__ # NFLAG = -D __KERNEL_SOA__ -D GRAINSIZE16 -D __USEDEVICE__ # NFLAG = -D __KERNEL_AOS_INT__ -D GRAINSIZE16 -D __USEDEVICE__ # NFLAG = -D __KERNEL_SOA_INT__ -D GRAINSIZE16 -D __USEDEVICE__ # NFLAG = -D __USEHOST__ # for comparison ################# Makefile rules ################# CC = gcc RM = /bin/rm PROG = run OBJS = main_host.o etc.o (以下、省略) //============== パラメータ用ヘッダファイルparam.h ============= #ifndef _PARAM_H_ #define _PARAM_H_ ///////////////////////////////////////////// // you can adjust ///////////////////////////////////////////// /* Notice! Maximum size is 512. */ //#define PBLOCK_PER_TBLOCK ( 32 ) //#define PBLOCK_PER_TBLOCK ( 64 ) //#define PBLOCK_PER_TBLOCK ( 96 ) //#define PBLOCK_PER_TBLOCK ( 128 ) //#define PBLOCK_PER_TBLOCK ( 160 ) #define PBLOCK_PER_TBLOCK ( 192 ) //#define PBLOCK_PER_TBLOCK ( 224 ) //#define PBLOCK_PER_TBLOCK ( 256 ) //#define PBLOCK_PER_TBLOCK ( 288 ) //#define PBLOCK_PER_TBLOCK ( 320 ) //#define PBLOCK_PER_TBLOCK ( 352 ) //#define PBLOCK_PER_TBLOCK ( 384 ) //#define PBLOCK_PER_TBLOCK ( 416 ) //#define PBLOCK_PER_TBLOCK ( 448 ) //#define PBLOCK_PER_TBLOCK ( 480 ) //#define PBLOCK_PER_TBLOCK ( 512 ) ///////////////////////////////////////////// // you cannot adjust ///////////////////////////////////////////// #ifdef GRAINSIZE1 #define GRAINSIZE ( 1 ) #elif GRAINSIZE4 #define GRAINSIZE ( 4 ) #elif GRAINSIZE16 #define GRAINSIZE ( 16 ) #endif #define NUM_THREADS_ON_TBLOCK ( (16/GRAINSIZE)*PBLOCK_PER_TBLOCK ) //===================== ソースファイルmain.c ================== // includes, system #include <stdio.h> // include, configuration #include "param.h" // includes, sub program #ifdef __USEHOST__ #include <hostAES.cpp> #elif __USEDEVICE__ #ifdef __KERNEL_AOS__ #include <kernel_AoS.cu> #elif __KERNEL_SOA__ #include <kernel_SoA.cu> #elif __KERNEL_AOS_INT__ #include <kernel_AoS_int.cu> #elif __KERNEL_SOA_INT__ #include <kernel_SoA_int.cu> #endif #endif //////////////////////////////////////////////////////////////////////////////////// // Program main //////////////////////////////////////////////////////////////////////////////////// int main(int argc, char **argv) { ... main文内でNUM_THREADS_ON_TBLOCKを使いまわす (以下、省略)

  • #if

    #if defined(DECRYPTION_KEY_SCHEDULE) #if DEC_ROUND == NO_TABLES #define ff(x) (x) #else #define ff(x) inv_mcol(x) #ifdef dec_imvars #define d_vars dec_imvars #endif #endif 上の部分をコンパイルすると、 'ff'マクロが再定義されました というエラーメッセージが出るのですが、 なぜ再定義になるのか分かりません。  OS:Win2000 コンパイラ VC++ 6.0 以前は、同じようなエラーが出て、 #else を使わないで全て書き直しました。  よろしくお願いいたします。

  • VCでコンパイラ実行時に警告を出す方法

    VCで #error ... とすると、コンパイルを失敗させて、エラーメッセージを出せますが、コンパイルは継続するが、メッセージだけは出すような方法は無いのでしょうか。 #ifndef USE_FUNC_A #warning この設定だとここの機能は使えません #endif こんな感じのことができないでしょうか。

  • error LNK2001について

    C++ の勉強中です。 error LNK2001問題がありました。問題点も分からないから、 分かった方に教えていただけないでしょうか? ソースも添付します。環境はVS2005 express edition まず、ヘッダファイルです。ファイル名は、myheader.h #ifndef __MYHEADER_H__ #define __MYHEADER_H__ #define includeshow(x) \ { \ s.show(x); \ } class Sample{ public: void show(char * parameter); }; extern Sample s; #endif //------------------------------------------------ 次に、Sample.cppです。 #include "myheader.h" #include <stdio.h> void Sample::show(char *parameter){ printf("in show func"); } //----------------------------------------------- 最後にTest.cppです。 #include "myheader.h" #include <stdio.h> int main(){ includeshow("ppppp"); } これで error LNK2001: 外部シンボル ""class Sample s" (?s@@3VSample@@A)" は未解決です。というエラーが出ています。 よろしくおねがいします。

  • PICC  ビルドトラブル

     宜しくお願いします。  あるソースファイル(net から入手)を ビルド しましたら 次のような メッセージ が 出ました。 これは どうしてでしょうか。 usart.h の 情報 も コピー します。  Error [141] C:\Users\tadao\Desktop\1207\0702_3.c; 3.18 can't open include file "usart.h": No such file or directory  #ifndef _SERIAL_H_ #define _SERIAL_H_ #define BAUD 9600 #define FOSC 4000000L #define NINE 0 /* Use 9bit communication? FALSE=8bit */ #define DIVIDER ((int)(FOSC/(16UL * BAUD) -1)) #define HIGH_SPEED 1 #if NINE == 1 #define NINE_BITS 0x40 #else #define NINE_BITS 0 #endif #if HIGH_SPEED == 1 #define SPEED 0x4 #else #define SPEED 0 #endif #if defined(_16F87) || defined(_16F88) #define RX_PIN TRISB2 #define TX_PIN TRISB5 #else #define RX_PIN TRISC7 #define TX_PIN TRISC6 #endif /* Serial initialization */ #define init_comms()\ RX_PIN = 1; \ TX_PIN = 1; \ SPBRG = DIVIDER; \ RCSTA = (NINE_BITS|0x90); \ TXSTA = (SPEED|NINE_BITS|0x20) void putch(unsigned char); unsigned char getch(void); unsigned char getche(void); #endif  C:\Users\tadao\Desktop\1207  以上 宜しくお願いいたします。 0256  

  • PROCのコンパイルエラーの取り方がわかりません

    ソース自体が長いので問題となっている所だけ書きます。 情報量が少なくて申し訳ありませんが…。 VC環境です。 /* define定義 */ #define IF_ITEM_CNT 14   ・   ・   ・ /* 内部関数プロトタイプ宣言 */ int AnalyzeProc( char **pReturnString, char *pTargetString, int StrNum, char String );          /* 文字列分解処理を行う関数 */   ・   ・   ・ /* グローバル変数宣言 */ char In_Rec[ IN_FILE_MAX_LEN + 1 ]; char *w_In_Rec[ IN_ITEM_CNT + 1 ];   ・   ・    int Main{ ・   ・   ・ } int MainProc{   ・   ・ strncpy( g_dn03_rec.DN03_KISYU_MEI, sizeof( g_dn03_rec.DN03_KISYU_MEI ), w_In_Rec[ 10 ], DN03_KISYU_MEI );   ・   ・   M_Res = AnalyzeProc( &w_IN_Rec, In_Rec, IF_ITEM_CNT, ',' );   ・ addSpeace( 0, 0, DN03_KISYU_MEI_LEN, _dn03_rec.DN03_KISYU_MEI );   ・   ・ return ( TRUE ); } となっているのですが、エラーが出ます。 Warning C4047 : '関数' : 内接参照のレベルが 'char **' と 'char *(*)[15]' で異ります。 Warning C4024 : 'AnalyzeProc' この型が 1 の仮引数および実引数と異なります。 Warning C4013 : 関数 'addSpace' は定義されていません。int型の値を返す外部関数と見なします。 あとリンクのエラーで error : LNK2019 : 未解決の外部シンボル _addSpeace が関数 _MainProc で参照されました。 fatal error LNK1120: 外部参照 1 が未解決です。 というエラーが出るのですがどう直していいかわかりません。 Warning C4047も型が違うのはわかるんですがどうすればいいのか…。 Warning C4013は前にこのエラーが出たときはプロトタイプ宣言することでエラーは無くなったんですが、 今回のは違うみたいです。宣言の仕方が悪かったのかもしれませんが。

  • HANDLEの宣言でのエラー

    現在C言語でプログラムを作成しています. シリアル通信を行うプログラムなのですが,エラーが出てしまい, ネットなどで検索してみたのですが,解決できませんでしたので,ご存知の方がいましたら,教えてください. エラーは以下のとおりです. [test.h] #ifndef INCLUDED_TEST_H #define INCLUDED_TEST_H HANDLE handle; HANDLE sirial(char ,char); void sirial_(HANDLE); #endif 上の用にヘッダファイルを作成し,グローバル変数の宣言・プロトタイプ宣言を行おうとすると型がHANDLEのところでエラーが出てしまいます. main関数と同じファイル内で宣言,定義した場合はエラーはでません. ヘッダファイルのように別ファイルに宣言するとエラーとなってしまうのです. 環境は Windows XP SP2 visual studio .net です. よろしくお願いします.