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

このQ&Aに関連する最新のQ&A

A 回答 (2件)

やはり、



#include <Motifのヘッダー>
#ifdef Max
#undef Max   // 一旦undefして
#endif
#include <それ以外のヘッダー>

とするのが正解かと。(あまり、エレガントではないですが)
Maxマクロがどこで定義されているのかはGrepツールを使って
インクルードファイル中を調べれば見つかるかと思いますが。
    • good
    • 0

某クラスライブラリのヘッダーを include している直前で



#undef Max

とする。但し、それ以降で、マクロ Max は使えません。
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Q2 ~ 200 の素数 a, b, c (a < b < c) が、b - a = c - b を満たすa,b,cをビット操作を用いて求め、すべてを表示せよ

ちょっと考えてみました。でも、分かりません・・・まず、int型のintvalに200bitを割り当てて、intval=0としたいのですが、どうしたらいいのでしょう??
とりあえず考えてみたプログラムを誰か見て下さい!!お願いします。
#define BYTESIZE 200
#define MAX 200
main()
{
int i,j,intval=0;
for(i=2;i<=MAX/2;i++)
{
if(intval&(1<<(i-1)){}
else for(j=i*2;j<=MAX;j+=i)intval|=(1<<(j-1));
}/*素数を0、それ以外を1に
for(i=2;i<=MAX/2;i++)
for(j=2;j<=(MAX-i)/2;j++)
if((intval&(1<<(i-1))&&(intval&(i+j-1))&&(intval&(1<<(i+2*j-1)))) print("%3d %3d %3d (%3d)\n",i,i+j,i+2*j,j);
}/*三つ子の素数を調べ出力

ちょっと考えてみました。でも、分かりません・・・まず、int型のintvalに200bitを割り当てて、intval=0としたいのですが、どうしたらいいのでしょう??
とりあえず考えてみたプログラムを誰か見て下さい!!お願いします。
#define BYTESIZE 200
#define MAX 200
main()
{
int i,j,intval=0;
for(i=2;i<=MAX/2;i++)
{
if(intval&(1<<(i-1)){}
else for(j=i*2;j<=MAX;j+=i)intval|=(1<<(j-1));
}/*素数を0、それ以外を1に
for(i=2;i<=MAX/2;i++)
for(j=2;j<=(MAX-i)/2;j++)
if((intval&...続きを読む

Aベストアンサー

まずint型は200ビットもありません。通常は32ビットです。
200ビット使いたければint型を7個用意する必要があります。
つまり
int intval[7];
宣言して、
intval[0] 0~31ビット
intval[1] 32~63ビット
intval[2] 64~95ビット
.
.
.
intval[6] 182~200ビット
として使います。

第iビットの情報を取り出すときは
(intval[i>>5]>>(i&31))&1

第iビットを1にするときは
intval[i>>5]|=1<<(i&31);

とすれば良いでしょう。
関数やマクロを用意することをお勧めします。
例えば
int get(int intval[],int i)
{
return (intval[i>>5]>>(i&31))&1;/*0か1が返って来る。*/
}

void on(int intval[],int i)
{
intval[i>>5]|=1<<(i&31);
}

という感じです。

まずint型は200ビットもありません。通常は32ビットです。
200ビット使いたければint型を7個用意する必要があります。
つまり
int intval[7];
宣言して、
intval[0] 0~31ビット
intval[1] 32~63ビット
intval[2] 64~95ビット
.
.
.
intval[6] 182~200ビット
として使います。

第iビットの情報を取り出すときは
(intval[i>>5]>>(i&31))&1

...続きを読む

Q”int *a,*b”というポインタ変数宣言した値でa=&bということ

”int *a,*b”というポインタ変数宣言した値でa=&bということはできる?


”int *a,*b”このような変数をグローバル宣言した場合、
a=&bというようなことはできるのでしょうか?


”int *a,*b”
この宣言で、
aが10番地
bが20番地に定義されたと仮定しています。

Aベストアンサー

#6です。
>回答頂きありがとうございます。
>一応整理させてください。
>質問1:
>(1)int *a, *b; //宣言
>(2)a = b;
>これをメモリアドレスの変化で見ていった場合、
>(1)
>アドレス10:a NULL
>アドレス20:b (仮に1200)
>(2)
>アドレス10:a (仮に1200)
>アドレス20:b (仮に1200)
回答:
OKです。但し
アドレス10:a NULL のところは正確には、アドレス10:a 不定
となります。
不定の意味は初期化していないので何が入っているか判らない。
(0かも知れないし、そうでないかも知れない。あるいは35かも知れないし、そうでないかもしれない)
という意味です。(NULLの箇所は以降同じです)


>質問2:
>(1)' int *a, *b; //宣言
>(2)' a = (int *)&b;
>これをメモリアドレスの変化で見ていった場合
>(1)'
>アドレス10:a NULL
>アドレス20:b NULL
>(2)'
>アドレス10:a 20
>アドレス20:b NULL
>このような違いがあるということですね。
回答
はい、その通りです。

>質問3:
>int *a, *b; //宣言
>a=&b;
>このやり方はできないので、
>もし、やりたいのならば、
>(1)'' int **a, *b //宣言
>(2)'' a=&b;
>これをメモリアドレスの変化で見ていった場合
>(1)''
>アドレス10:a NULL
>アドレス20:b NULL
>(2)''
>アドレス10:a 20
>アドレス20:b NULL
>このようにメモリ内が変化していくということなんでしょうか?
回答
はい、その通りです。
>質問3のポインタのポインタの使い方はこれでよいでしょうか?
回答
はい、よいです。
ちなみに、このような事例に遭遇することはないでしょうが、
int ***a,**b;
の場合、a=&bは構文的に正しいです。
a=(int***)b;(強引なキャスト)
も正しいです。
int *a;
int **a;
int ***a;
の違いを理解することが必要です。
使いませんが、
int **********a;なども構文的にはありです。

#6です。
>回答頂きありがとうございます。
>一応整理させてください。
>質問1:
>(1)int *a, *b; //宣言
>(2)a = b;
>これをメモリアドレスの変化で見ていった場合、
>(1)
>アドレス10:a NULL
>アドレス20:b (仮に1200)
>(2)
>アドレス10:a (仮に1200)
>アドレス20:b (仮に1200)
回答:
OKです。但し
アドレス10:a NULL のところは正確には、アドレス10:a 不定
となります。
不定の意味は初期化していないので何が入っているか判らない。
(0かも知れないし、そうでないかも知れない。あるいは35かも知れない...続きを読む

Qマウスの位置でa,bの値が変化し、a,bの値が変化することでpx,pz

マウスの位置でa,bの値が変化し、a,bの値が変化することでpx,pzの値も変化し、車の座標が変わるようにしたいのですが、以下のようにするとマウスを動かしても反応がありません。
px = a; の部分を px = 10; にしてみると車の座標が変わるため、static void mouseの部分がおかしいと思うのですが、どう間違えているか分からないでしょうか?
文字数制限の関係上、関連する部分のみ抜粋します。


#include <stdlib.h>
#include <GL/glut.h>

#define W 6
#define D 9

int s,t,a,b;

static void display(void)
{
const static GLfloat lightpos[] = { 3.0, 4.0, 5.0, 1.0 }; /* 光源の位置 */
const static GLfloat yellow[] = { 0.8, 0.8, 0.2, 1.0 }; /* 車の色   */
static GLdouble px = 0.0, pz = 0.0; /* 車の位置  */
static GLdouble r = 0.0; /* 車の方向  */

px = a;
pz = b;

/* 画面クリア */
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

/* モデルビュー変換行列の初期化 */
glLoadIdentity();

/* 光源の位置を設定 */
glLightfv(GL_LIGHT0, GL_POSITION, lightpos);

/* 視点の移動(物体の方を奥に移す)*/
glTranslated(0.0, 0.0, -25.0);
glRotated(30.0, 1.0, 0.0, 0.0);

/* シーンの描画 */
myGround(0.0);
glPushMatrix();
glTranslated(px, 1.0, pz);
glRotated(r - 90.0, 0.0, 1.0, 0.0);
glMaterialfv(GL_FRONT, GL_DIFFUSE, yellow);
glutSolidTeapot(1.0);
glPopMatrix();

glFlush();
}

static void resize(int w, int h){
s = w/2;
t = h/2;
}

static void mouse(int u, int v) //
{
if((s - u) > 0){
a = 10;
}else if((s - u) < 0){
a = -10;
}
if((t - v) > 0){
b = 10;
}else if((t - v) < 0){
b = -10;
}

}

int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH);
glutCreateWindow(argv[0]);
glutDisplayFunc(display);
glutReshapeFunc(resize);
glutKeyboardFunc(keyboard);
init();
glutMainLoop();
glutPassiveMotionFunc(mouse);//マウスドラッグ時
return 0;
}

マウスの位置でa,bの値が変化し、a,bの値が変化することでpx,pzの値も変化し、車の座標が変わるようにしたいのですが、以下のようにするとマウスを動かしても反応がありません。
px = a; の部分を px = 10; にしてみると車の座標が変わるため、static void mouseの部分がおかしいと思うのですが、どう間違えているか分からないでしょうか?
文字数制限の関係上、関連する部分のみ抜粋します。


#include <stdlib.h>
#include <GL/glut.h>

#define W 6
#define D 9

int s,t,a,b;

static void display(void)
{
...続きを読む

Aベストアンサー

glutMainLoop();
glutPassiveMotionFunc(mouse);//マウスドラッグ時

どうしてglutMainLoopのあとでglutPassiveMotionFuncをコールしてるの?

Qc#について質問があります。 a b c d など任意の文字を入れたら abcd とスペースを

c#について質問があります。
a b c d
など任意の文字を入れたら
abcd
とスペースをなくすプログラムを作成したいです。
任意の数字なので
string a=console.ReadLine()
とします。
この後から分かりません。
わかる方教えてください(´・_・`)

Aベストアンサー

No1の方の回答は、
a内のスペースを""(長さ0の文字列)に置き換える方法です。
この方法がシンプルでかつ速いため、実戦では、この方法を採用したほうが良いでしょう。
a内のスペースを取り除くことを自前で行うには、どうするかという観点で考えると、
以下のようになります。
----------------------------------
using System;
namespace goo
{
class Program
{
static void Main(string[] args)
{
Console.Write("文字列を入力してください:");
string a = Console.ReadLine();
string b = "";
int i;
for (i = 0; i < a.Length; i++)
{
if (a[i] != ' ')
{
b = b + a[i];
}
}
Console.WriteLine(b);
}
}
}
------------------------------------------------------
結果を格納する文字列として、bを用意しておき、
a内の空白でない文字をbへ加算していきます。
実行結果は以下のようになります。
文字列を入力してください:a b c h
abch

No1の方の回答は、
a内のスペースを""(長さ0の文字列)に置き換える方法です。
この方法がシンプルでかつ速いため、実戦では、この方法を採用したほうが良いでしょう。
a内のスペースを取り除くことを自前で行うには、どうするかという観点で考えると、
以下のようになります。
----------------------------------
using System;
namespace goo
{
class Program
{
static void Main(string[] args)
{
Console.Write("文字列を入力してください:");
string a = Console.ReadLine()...続きを読む

Q【#define】 defineで定義した値を配列のサイズに使う事は可能?

タイトルの通り、defineで定義した値を配列のサイズ指定に使いたいと考えています。
この場合、次のような使い方をしても問題ないのでしょうか?

/* サンプルここから */
#define SIZE_A 10
#define SIZE_B 20
#define SIZE_ALL (SIZE_A * SIZE_B)

cahr ARR[SIZE_ALL];
/* サンプルここまで */

コンパイル時にワーニング等はありませんが、int型という型を宣言していないSIZE_ALLを要素数として使用するのが不安に感じるのですが問題ないのでしょうか?

int SIZE_int = SIZE_ALL;
とdefineした値を明示的にint型変数に代入した上で、
cahr ARR[SIZE_int];
とすべきなのでしょうか?

初歩的な質問ですが、ご教示お願いします。

Aベストアンサー

★特に問題ありません。
・普通に define された定数を掛け算などして新しい記号定数を定義します。
 そしてその記号定数を配列などの添え字に使います。
 そもそも define された定数は通常は int 型と同じになります。
 #define SIZE_A 10…int型
 #define SIZE_A 10L…long型
 #define SIZE_A 10LL…long long型
 となります。
 『L』や『LL』のサフィックスを付けないとすべて int 型に解釈されます。
 つまり、プリプロセッサ命令は単純な文字列の置換ですのでサフィックスを
 付けないと int 型になるわけですよ。
・もし char 型にしたいならキャストを指定します。
 例えば
 #define SIZE_A ((char)(10))
 とします。
・もう既に回答がありますが
>int SIZE_int = SIZE_ALL;
>とdefineした値を明示的にint型変数に代入した上で、
>cahr ARR[SIZE_int];
>とすべきなのでしょうか?
 ↑
 この方法は新しい記述方法です。
 1999年の最新のC言語の規格です。
 この C99 にすべてのコンパイラが対応しているわけではないため使わない方が
 良いかもしれません。この記述が利用できれば便利なこともありますが…。
・最後にカッコをつけた方が良いですよ。
 #define SIZE_A (10)
 #define SIZE_B (20)
 #define SIZE_ALL (SIZE_A * SIZE_B)
 という風に SIZE_A、SIZE_B に括弧を付けます。
 これは今後 SIZE_A を『10 + 20』と定義した際に括弧がないと計算式が
 正しくなくなるので付けるように習慣を付けておいた方が良いということです。
 つまり今後
 #define SIZE_A 10 + 20
 #define SIZE_B 20 * 3
 #define SIZE_ALL (SIZE_A * SIZE_B)
 と定義したとします。
 すると SIZE_ALL は (10 + 20 * 20 * 3) と置換されますが計算式が掛け算を先に
 する数学上のルールより意図しない結果になります。正しくは SIZE_ALL=1800 に
 なるべくところが SIZE_ALL=1210 となってしまいます。
・これを防ぐには2つ。
 #define SIZE_A (10 + 20)
 #define SIZE_B (20 * 3)
 #define SIZE_ALL (SIZE_A * SIZE_B)
 もしくは
 #define SIZE_A 10 + 20
 #define SIZE_B 20 * 3
 #define SIZE_ALL ((SIZE_A) * (SIZE_B))
 と定義します。
 どちらにカッコを付けても同じですが私はすべてにカッコを付ける派です。
・参考にして下さい。

★特に問題ありません。
・普通に define された定数を掛け算などして新しい記号定数を定義します。
 そしてその記号定数を配列などの添え字に使います。
 そもそも define された定数は通常は int 型と同じになります。
 #define SIZE_A 10…int型
 #define SIZE_A 10L…long型
 #define SIZE_A 10LL…long long型
 となります。
 『L』や『LL』のサフィックスを付けないとすべて int 型に解釈されます。
 つまり、プリプロセッサ命令は単純な文字列の置換ですのでサフィックスを
 付けないと ...続きを読む


このカテゴリの人気Q&Aランキング

おすすめ情報