水曜日, 11月 06, 2019

XC8 と XC16 で複数ソースファイルに使える「グローバル変数」の定義の仕方が違う?

前提として,
  • main.c
  • 再利用できそうな関数を記述した my_lib.c とそのヘッダーファイル my_header.h
  • main.c と my_lib.c で共通で使う変数 my_c
があるものとする。このいわゆる「グローバル変数」である my_c の定義,以下のように書かないと,エラーになったり,局所的なファイルになったりする。

XC8
my_header.h
extern char my_c = 'H'; // グローバル変数

void my_init(void); // my_lib.c で記述し,main.c から呼ばれる関数
void my_print(void); // my_lib.c で記述し,main.c から呼ばれる関数
my_lib.c
#include "my_header.h"

void my_init(void) {
    // my_c を使って関数記述
}

void my_print(void) {
    // my_c を使って関数記述
}
main.c
#include "my_header.h"

void main(void)
{
    // my_c, my_init, my_print を使う
}

XC8の別の方法
my_header.h
// extern char my_c = 'H'; // グローバル変数 これは不要

void my_init(void); // my_lib.c で記述し,main.c から呼ばれる関数
void my_print(void); // my_lib.c で記述し,main.c から呼ばれる関数
my_lib.c
#include "my_header.h"

char my_c = 'H'; // 実はグローバル変数

void my_init(void) {
    // my_c を使って関数記述
}

void my_print(void) {
    // my_c を使って関数記述
}
main.c
#include "my_header.h"

extern char my_c; // extern宣言必須

void main(void)
{
    // my_c, my_init, my_print を使う
}

XC16

my_header.h
// extern char my_c = 'H'; // グローバル変数 これは不要

void my_init(void); // my_lib.c で記述し,main.c から呼ばれる関数
void my_print(void); // my_lib.c で記述し,main.c から呼ばれる関数
my_lib.c
#include "my_header.h"

char my_c = 'H'; // 実はグローバル変数

void my_init(void) {
    // my_c を使って関数記述
}

void my_print(void) {
    // my_c を使って関数記述
}
main.c

// #include "my_header.h" // これが不要

extern char my_c; // extern宣言必須

void main(void)
{
    // my_c, my_init, my_print を使う
}

うーむ,わけわからん。。。誰か教えてください!(切実)

0 件のコメント: