ページ 11

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

Posted: 2016年1月28日(木) 21:16
by やまっち
いつもお世話になっております。

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;
}

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

Posted: 2016年1月28日(木) 21:27
by みけCAT
ベストかはわかりませんが、利用する関数をきちんと宣言するべきだと思います。

コード:

// testB.c

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

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

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

Posted: 2016年1月28日(木) 22:18
by やまっち
みけ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;
}


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

Posted: 2016年1月28日(木) 22:52
by みけCAT
プロトタイプ宣言がないからでしょう。

コード:

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;
}


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

Posted: 2016年1月30日(土) 06:39
by やまっち
みけCAT さんの言う通りの修正でワーニングは無くなりました。
本当に助かりました。ありがとうございました。

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