複数のソースで共有する変数

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
やまっち
記事: 20
登録日時: 10年前

複数のソースで共有する変数

#1

投稿記事 by やまっち » 9年前

いつもお世話になっております。

Windows 7 で bcc32 を使っています。

複数のソースで共有する変数を使う方法として
いくつかの方法があると思いますが、
以下のように static で宣言した common と言う変数が
あるとして、その変数へのポインタを使う事で
もう1つのソースから common を使おうと以下のように書いたのですが
W8069 移植性のないポインタ変換
と言うワーニングが出ます。動作自体は想定通りに動きます。
このワーニングに対し、どのように対処するのがベストでしょうか?

ポインタに付いての理解であやふやな所があり、もし間違った
事をしているようであれば、ご指摘下さい。
よろしくお願いします。

コード:

// test.c

#include <stdio.h>

static int common=10; // common は内部リンケージである事が必須
void addFive(void);

void main(void)
{
	printf("before common = %d\n",common);
	addFive();
	printf("after common = %d\n",common);
}

int* getAddr(){
	return &common;
}

コード:

// testB.c

void addFive(void){
	int *p;
	p=getAddr(); // W8069 移植性のないポインタ変換
	*p=*p+5;
}

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 複数のソースで共有する変数

#2

投稿記事 by みけCAT » 9年前

ベストかはわかりませんが、利用する関数をきちんと宣言するべきだと思います。

コード:

// testB.c

int* getAddr(); /* 追加 */

void addFive(void){
	int *p;
	p=getAddr(); // W8069 移植性のないポインタ変換
	*p=*p+5;
}
宣言をソースファイルに直接書くのではなく、ヘッダファイルに書いておいてそれをインクルードしてもいいかもしれません。
オフトピック
main関数の戻り値の型はvoidではなくintにする方がいいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

やまっち
記事: 20
登録日時: 10年前

Re: 複数のソースで共有する変数

#3

投稿記事 by やまっち » 9年前

みけCAT さん、ご回答頂きましてありがとうございます。

  W8069 移植性のないポインタ変換
のワーニングは無くなったのですが、今度は
  W8065 プロトタイプ宣言のない関数 'getAddr' の呼び出し
と言うのが発生するようになってしまいました。

プロトタイプ宣言されているように見えるのですが、
なぜこのようなワーニングが出るのか、分かりますでしょうか?

コード:


// test.c

#include <stdio.h>

static int common=10; // common は内部リンケージである事が必須
void addFive(void);

int main(void)
{
	printf("before common = %d\n",common);
	addFive();
	printf("after common = %d\n",common);
	return 0;
}

int* getAddr(){
	return &common;
}


コード:


// testB.c

int* getAddr(); /* 追加 */

void addFive(void){
	int *p;
	p=getAddr(); // 警告 W8065 プロトタイプ宣言のない関数 'getAddr' の呼び出し
	*p=*p+5;
}


アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 複数のソースで共有する変数

#4

投稿記事 by みけCAT » 9年前

プロトタイプ宣言がないからでしょう。

コード:

int* getAddr();
はただの関数宣言であり、引数の型が指定されていないのでプロトタイプ宣言ではありません。
関数の宣言、定義ともに引数の型を指定するといいでしょう。

コード:


// test.c

#include <stdio.h>

static int common=10; // common は内部リンケージである事が必須
void addFive(void);

int main(void)
{
	printf("before common = %d\n",common);
	addFive();
	printf("after common = %d\n",common);
	return 0;
}

int* getAddr(void){
	return &common;
}


コード:


// testB.c

int* getAddr(void); /* 追加 */

void addFive(void){
	int *p;
	p=getAddr(); // 警告 W8065 プロトタイプ宣言のない関数 'getAddr' の呼び出し
	*p=*p+5;
}

複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

やまっち
記事: 20
登録日時: 10年前

Re: 複数のソースで共有する変数

#5

投稿記事 by やまっち » 9年前

みけCAT さんの言う通りの修正でワーニングは無くなりました。
本当に助かりました。ありがとうございました。

> はただの関数宣言であり、引数の型が指定されていないのでプロトタイプ宣言ではありません。
> 関数の宣言、定義ともに引数の型を指定するといいでしょう。

閉鎖

“C言語何でも質問掲示板” へ戻る