• ベストアンサー

シンボル名の再定義のためにコンパイルエラー

Motifのヘッダー(Aとする)にMax(a,b)というdefineがあり、そのヘッダーの(恐らく)後にincludeしている某クラスライブラリのヘッダー(Bとする)の関数定義にMax(a,b)というのがあります。 そのため、B中のMaxでは、Aのdefineが展開されてしまい、コンパイルエラーになってしまいます。 どちらのヘッダーも修正するわけにはいかないのですが、includeの順番を変えようにも、どこでincludeされているのか調査するのも難航しています。 何か回避策、もしくは解析するのに便利なツールなどご存知でしたら教えてください。 なお、開発環境はUNIX(正しくはAIX)です。

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

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

やはり、 #include <Motifのヘッダー> #ifdef Max #undef Max   // 一旦undefして #endif #include <それ以外のヘッダー> とするのが正解かと。(あまり、エレガントではないですが) Maxマクロがどこで定義されているのかはGrepツールを使って インクルードファイル中を調べれば見つかるかと思いますが。

その他の回答 (1)

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.1

某クラスライブラリのヘッダーを include している直前で #undef Max とする。但し、それ以降で、マクロ Max は使えません。

関連するQ&A

  • ヘッダファイルの2重のインクルードについて

    ある書物に「ヘッダファイルを複数回インクルードすると、それを”再定義”することによるエラーになる」と書いてありますたが、以下のようなヘッダファイルを作りそれを数回インクルードしても何ら異状が無くコンパイルできました。 math.h→ヘッダファイル名 #define max(a,b)  ((a)>(b)?(a):(b))→ヘッダファイルの内容 c ファイル #include<stdio.h> #include"math.h"←複数回インクルード #include"math.h"←複数回インクルード int main(void){ int x=1,y=2; printf("max(x,y)=%d\n",max(x,y)); return 0; } 環境としては、RedHat Linuxでviです。 何ゆえ、エラーにならないのか良く解りません。 宜しくお願いします。

  • Unsatisfied code symbol エラーについて

    UNIX上でcのプログラムを作成しています。 OSはHP-UX B.11.23 U ia64 (td)です。 共有ライブラリ(~.sl)を作成したのですが、 これを実行モジュール(a.out)にリンクしてコンパイルして、a.outを実行すると、 エラーになってしまいます。 エラーの内容は、 /usr/lib/hpux64/dld.so: Unsatisfied code symbol 'xxxxx' in load module '/.../...~/a.out'. というもので、ライブラリ内にあるはずのxxxxxをa.outで使用しているのですが、 これが見つからないというエラーのように思えます。 ライブラリ内にはいくつか関数を用意していて、そのほかの関数は普通に使えています。 ライブラリを作成するときにincludeファイルを用意していますが、 その中でexternで関数の宣言をしていて、 xxxxxが他の関数と異なった設定をしているとは思えません。 このような場合、エラーの原因としてどのようなことが考えられるでしょうか? ほとほと困っています…。 どなたか解決方法をご教授願います。 またライブラリに含まれる関数を表示させるUNIXコマンドってありましたでしょうか? もしご存知でしたらあわせて教えていただけると助かります。 何か必要な情報で書き足りないものがありましたら、補足いたしますのでご指摘ください。 よろしくお願いいたします。

  • WindowsでコンパイルできるがUNIXではできない

    下記のプログラムは、2^-0.94を計算するものです。 このプログラムはwindows2000のマシンでコンパイルできるのですが、UNIXのマシンだと Unresolved text symbol "pow" というエラーがでてコンパイルできません。 UNIXのマシンは「cc ファイル名」でコンパイルを実行します。 どうすればコンパイルできるようになるのでしょうか。お手数ですが、教えてください。よろしくお願いします。 ※windows2000マシンのコンパイラ:Borland C++ Compiler 5.5 #include <stdio.h> #include <math.h> int main() { int a; double b,c; a=2; b=-0.94; c=pow(a,b); printf("%lf\n",c); return 0; }

  • 分割コンパイルについて

    現在分割コンパイルが分からずに苦戦しています。 下記のリストは構造体を使わなければコンパイラを通すことができましたが、 使うとなぜか通りません。 あれこれ試しましたがどうしても分かりません。 何がおかしいのでしょうか? *define.hで全てのファイルへの定義や宣言を行わせています。 ////////////// //Main.cpp ////////////// #include <stdio.h> #include <conio.h> #include "define.h" int main( void ){ Tmp[0].c = 15; printf("a: %d\n", a); printf("b: %d\n", b); printf("c: %d\n", Tmp[0].c); printf("NUM:%d\n", NUM); aaa(); bbb(); getch(); return 0; } ////////////////// // A.cpp ///////////////// #include <stdio.h> #include "define.h" void aaa( void ){ printf("a: %d\n", a); printf("b: %d\n", b); printf("c: %d\n", Tmp[0].c); printf("NUM:%d\n", NUM); } ////////////////// // B.cpp ///////////////// #include <stdio.h> #include "define.h" void bbb( void ){ printf("a: %d\n", a); printf("b: %d\n", b); printf("c: %d\n", Tmp[0].c); printf("NUM:%d\n", NUM); } ////////////////// // define.cpp ///////////////// #include "define.h" int a = 10; int b = 20; struct Parameter { int c; }; struct Parameter Tmp[NUM]; ////////////////// // define.h ///////////////// #define NUM 100 extern int a; extern int b; extern struct Parameter Tmp[NUM]; void aaa( void ); void bbb( void );

  • 前処理指令行の末尾の改行の必要性

    ある本に次のような例題がありました。 「不正なヘッダ」 #define max(a,b) ((a)>(b)?(a):(b)) EOF 「正しいヘッダ」 #define max(a,b) ((a)>(b)?(a):(b)) ←Enterキー EOF ここで”不正なヘッダ”でコンパイルするとエラー表示のメッセージが表示され、その理由は”前処理指令は改行文字で終了しなければならない”との事です。又処理系によっては”不正なヘッダ”(改行文字なし)が許されるものもあると書かれていました。しかしその場合、可搬性は損なわれると書いてありました。私の処理系はRedHat Linuxでviを使っています。私の処理系で”不正なヘッダ”でコンパイルしてもなんらメッセージが無くコンパイルできました。 はたしてこの場合可搬性はあるのでしょうか? 又その本には”ソースファイルの最後の行にも必ず改行文字をつけよう”と書いてありました。しかしviを使っていてcプログラムとしてソースファイルを書いている時、最後に改行文字を入れた事はありませんでした。この場合も可搬性は失われるのでしょうか。 宜しく願います。

  • 外部シンボルが未解決

    本に載っていたソースなんですが,外部シンボル 'drand48()' が未解決(C:\NYU.OBJ が参照)というエラーが出てなかなかコンパイルできません。drand48という関数はstdlib.hに含まれていると思うのですが,何故だか分かりません。どなたか分かる方,是非ともお力をお貸しください。 環境はbcc55です。元のソースはC++Builder4で作られたそうです。字数の関係ですべて載せることができませんが,よろしくお願いします! #include <stdio.h> #include <math.h> #include <string.h> #include <locale.h> #include <stdlib.h> #define Iunits 14 #define Hunits 200 #define Ounits 2 #define Rlow -0.30 #define Rhigh 0.30 #define A 1.4 #define B 0.3 #define fout(x) ( 1 / (1 + exp( -(x) ) )) #define urand() ( drand48() * (Rhigh - Rlow) + Rlow ) ~中略 void initialize()/*各ユニットに乱数で重みを振り当てる*/ { int i,j; for (i = 0; i < Hunits; i++){ for (j = 0; j < Iunits; j++){ wih[i][j] = urand(); } shikiih[i] = urand(); } for (i = 0; i < Ounits; i++){ for (j = 0; j < Hunits; j++){ who[i][j] = urand(); } shikiio[i] = urand(); } } ~少略

  • 分割コンパイルの初歩

    C言語ですが、.hに実装を書くのは避けたほうが良いといわれます。 私は main.c define.h aaa.h bbb.h みたいなスタイルでコードを書いていました。 まずdefine.hでグローバル変数や、マクロなどの宣言を まとめて行い、ほかの.hやmain.cでも使えるようにして いました。 しかし、以下のような状況のとき、どのように分割すれば 良いのかが分かりません・・・。 たとえば、以下のように、マクロNUM、変数a,bをすべてのファイルで共有して使えるように分割コンパイルするにはどのようにコードを書き直せば良いのでしょうか? //--------------main.c------------------ #include "define.h" #include "aaa.h" #include "bbb.h" int main( void ){   printf("%d", a);   printf("%d", b);   printf("%d", NUM);   aaa();   bbb();   return 0; } //------------define.h------------------ #define NUM 100 int a = 10; int b = 20; void aaa( void ); void bbb( void ); //------------aaa.h------------------ void aaa( void ){   printf("%d", a);   printf("%d", b);   printf("%d", NUM); } //------------bbb.h------------------ void bbb( void ){   printf("%d", a);   printf("%d", b);   printf("%d", NUM); }

  • 分割コンパイルの#defineについて

    分割コンパイルで ファイル1 #include <stdio.h> #define number 10 char string[number]; int main(void){ string[0]='a'; string[1]='b'; file_to(); return 0; } ファイル2 #include <stdio.h> #define number 10 extern char string[number]; void file_to(void){ /***何かの処理をする*****/ } って感じなんですけども、配列string の中身の値をdefineによって指定しているのですが、片方のdefineの値を変更する時、もう一つのdefineも手動で変更しています。関係するファイル数が多くなってくると大変なので、どれかのdefineの値を変化させたら自動的に他のdefineの値も変更するプログラムの組み方はありませんか? 質問がわかりにくいかも知れませんがよろしくお願いします。

  • C言語でヘッダファイルを自作する

    C言語で#defineを用いてヘッダファイルを作成したのですが、 作成したコンパイルするときにヘッダファイルがオープンできません。 参考にしている資料があるのですが、そこに書かれているサンプルプログラムを 丸ごとコピーして作ったプログラムも同様にヘッダファイルがオープンできない というエラーが出るので、ヘッダファイルを定義する方法そのものが間違っていると 思うのですが、どこが間違っているのでしょうか? よろしければ正しい記述方法もお教えください。 #include <stdio.h> #if !defined SAMPLE_H #define SAMPLE_H wa(int a, int b) { return a+b; } #endif #include "sample.h" int main(){ printf("%d\n",wa(40,70)); return 0; } ヘッダファイルの定義の方法は他にもあるとは思いますが、 今回は#defineを用いた方法でお願いします。

  • fortran:includeできないとエラーがでます

    unix上にtelnetしてプログラムをつくっているのですが、fortranのプログラム中でinclude文を実行するとコンパイル時に Cannot open include file ’ヘッダーファイル名’ と出ます。 読み込むヘッダーファイルは市販のものをインストールしたものでこのファイルは/usr/includeにシンボリックリンクの形で存在しリンク先も存在します。ちなみにヘッダーファイル名を実在しないものにしても同じエラーメッセージが出ます。 なにが原因なのでしょうか。お心当たりのある方はよろしくお願いいたします。