※ ChatGPTを利用し、要約された質問です(原文:プリプロセッサの上手な使い方を教えて下さい)
プリプロセッサの上手な使い方
このQ&Aのポイント
C言語のプリプロセッサを上手に使ってソースコードを綺麗に整える方法について教えてください。
プログラムのソースコードを分割し、メイクファイルやパラメータ用のヘッダファイルを作成する場合は、どのような方法が上手いのか教えてください。
パラメータ用のヘッダファイルにはどのような設定を書くのが適切でしょうか?また、文字マクロはヘッダファイルで設定するべきなのでしょうか?
美しいソースを書けるようになりたくて日々自分のソースを見直しています。現在C言語を学習していますが基本的に独学なので、猛者な方々のご意見を伺いたいと思っています。
現在書いているプログラムが大規模になってしまったので、ソースを分割しまして、メイクファイルも作りました。何か条件を与えてそこからインクルードするファイルを選択したい、また静的にパラメータも与えたいというような場合、一般にどのようにするのが上手い方法なのか教えて頂きたく思います。メイクファイル、パラメータ用のヘッダファイル、ソースファイルの3つをそれぞれ下のように書いたんですが、一般にこういう書き方をしますでしょうか?自信が持てないでいます。猛者な方々のご意見をお待ちしています。長いソースのようですが、処理以前の問題です。よろしくお願いします。
パラメータして与えたいのは、
PBLOCK_PER_TBLOCK
GRAINSIZE
インクルードするファイルそのもの
になります。これらは全てメイクファイルで設定するのが自然ですか?それともヘッダファイルで設定するものなのでしょうか?その場合、文字マクロもヘッダファイルで設定するものなのでしょうか?
でも、ヘッダファイルで、
#define __KERNEL_SOA__
などと書いているのを見かけないと思うのですが。。。
//========================= メイクファイル ======================
########### Please select encoding type ###########
NFLAG = -D __KERNEL_AOS__ -D GRAINSIZE16 -D __USEDEVICE__
# NFLAG = -D __KERNEL_SOA__ -D GRAINSIZE16 -D __USEDEVICE__
# NFLAG = -D __KERNEL_AOS_INT__ -D GRAINSIZE16 -D __USEDEVICE__
# NFLAG = -D __KERNEL_SOA_INT__ -D GRAINSIZE16 -D __USEDEVICE__
# NFLAG = -D __USEHOST__ # for comparison
################# Makefile rules #################
CC = gcc
RM = /bin/rm
PROG = run
OBJS = main_host.o etc.o
(以下、省略)
//============== パラメータ用ヘッダファイルparam.h =============
#ifndef _PARAM_H_
#define _PARAM_H_
/////////////////////////////////////////////
// you can adjust
/////////////////////////////////////////////
/* Notice! Maximum size is 512. */
//#define PBLOCK_PER_TBLOCK ( 32 )
//#define PBLOCK_PER_TBLOCK ( 64 )
//#define PBLOCK_PER_TBLOCK ( 96 )
//#define PBLOCK_PER_TBLOCK ( 128 )
//#define PBLOCK_PER_TBLOCK ( 160 )
#define PBLOCK_PER_TBLOCK ( 192 )
//#define PBLOCK_PER_TBLOCK ( 224 )
//#define PBLOCK_PER_TBLOCK ( 256 )
//#define PBLOCK_PER_TBLOCK ( 288 )
//#define PBLOCK_PER_TBLOCK ( 320 )
//#define PBLOCK_PER_TBLOCK ( 352 )
//#define PBLOCK_PER_TBLOCK ( 384 )
//#define PBLOCK_PER_TBLOCK ( 416 )
//#define PBLOCK_PER_TBLOCK ( 448 )
//#define PBLOCK_PER_TBLOCK ( 480 )
//#define PBLOCK_PER_TBLOCK ( 512 )
/////////////////////////////////////////////
// you cannot adjust
/////////////////////////////////////////////
#ifdef GRAINSIZE1
#define GRAINSIZE ( 1 )
#elif GRAINSIZE4
#define GRAINSIZE ( 4 )
#elif GRAINSIZE16
#define GRAINSIZE ( 16 )
#endif
#define NUM_THREADS_ON_TBLOCK ( (16/GRAINSIZE)*PBLOCK_PER_TBLOCK )
//===================== ソースファイルmain.c ==================
// includes, system
#include <stdio.h>
// include, configuration
#include "param.h"
// includes, sub program
#ifdef __USEHOST__
#include <hostAES.cpp>
#elif __USEDEVICE__
#ifdef __KERNEL_AOS__
#include <kernel_AoS.cu>
#elif __KERNEL_SOA__
#include <kernel_SoA.cu>
#elif __KERNEL_AOS_INT__
#include <kernel_AoS_int.cu>
#elif __KERNEL_SOA_INT__
#include <kernel_SoA_int.cu>
#endif
#endif
////////////////////////////////////////////////////////////////////////////////////
// Program main
////////////////////////////////////////////////////////////////////////////////////
int main(int argc, char **argv)
{
...
main文内でNUM_THREADS_ON_TBLOCKを使いまわす
(以下、省略)
補足
有難う御座います。教えて頂いた方向性で修正してみたいと思います。 うまいこと修正できたら、ここにアップしてみたいと思います。