• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:プリプロセッサを使用して関数名を任意に変化できますか。)

プリプロセッサを使用して関数名を変化させる方法

このQ&Aのポイント
  • Cの学習をしている際に、プリプロセッサを使用して関数名を変化させることは可能でしょうか。
  • 例えば、#defineを使用して関数名を定義し、プリプロセッサによる置換を行うことで、関数名の変化を実現することができます。
  • しかし、関数名の変化をプリプロセッサで行う場合、一部の制約が存在する可能性があります。詳しい方法や制約については、詳細な説明を必要とする場合は、書籍やドキュメントを参照することをおすすめします。

質問者が選んだベストアンサー

  • ベストアンサー
  • hofuhofu
  • ベストアンサー率70% (336/476)
回答No.1

トークン連結演算子のようなもののことでしょうか。 #define HOGE(PREF) void foo_##PREF(){printf("\n");} HOGE(foo) HOGE(hoge) int main(){ foo_foo(); foo_hoge(); return 0; }

参考URL:
http://www.microsoft.com/japan/developer/library/vccore/_predir_token.2d.pasting_operator.htm
全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • defineで定数が置き換えられない?(C言語)

    #defineについて質問です。 #defineは、ソースコード内にこの文字を見つけたら、コンパイルする前にこの文字をこの定数に置き換えて、というプリプロセッサですよね?だから、printfで#defineで定義した定数を出力する場合で、変換指定が必要ない場合は #include <stdio.h> #define DEF 100 void main(){ printf("#defineで定義された定数はDEFです"); } でもいいと思うんです。ですがこのソースコードは間違いで、実行結果は #defineで定義された定数はDEFです(←置き換えられてない) となってしまします。プリプロセッサだけ実行しても、DEFは100に置き換えられずそのままです。printfで#defineで定義した定数を出力させたい場合は書式指定をしなければなりません。なぜ、このような場合は#defineで定義した定数は置き換えられないのでしょうか?回答よろしくお願いします。

  • プリプロセッサ#ifdef~#endifについて

    C言語のプリプロセッサ#ifdef~#endifを使用して以下のソースファイルを作成しました。コンパイルするとエラーになります。 (pre.c)*********************** /* 各行の頭は行番号を表しています。*/ /* 実際のソースには記述していません。 */ 1: #include <stdio.h> 2: 3: #define TAB 0x61 4: #ifdef TAB 5: printf("%c", TAB); 6: #endif 7: 8: int main(void) { 9: return 0; 10: } ****************************** C:\>cl pre.c Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86 Copyright (C) Microsoft Corporation. All rights reserved. pre.c pre.c(5) : error C2143: 構文エラー : ')' が '文字列' の前にありません。 pre.c(5) : error C2143: 構文エラー : '{' が '文字列' の前にありません。 pre.c(5) : error C2059: 構文エラー : '<不明>' pre.c(5) : error C2059: 構文エラー : ')' 原因について、どなたか教えて頂けませんでしょうか?

  • 分割コンパイルについて

    現在分割コンパイルが分からずに苦戦しています。 下記のリストは構造体を使わなければコンパイラを通すことができましたが、 使うとなぜか通りません。 あれこれ試しましたがどうしても分かりません。 何がおかしいのでしょうか? *define.hで全てのファイルへの定義や宣言を行わせています。 ////////////// //Main.cpp ////////////// #include <stdio.h> #include <conio.h> #include "define.h" int main( void ){ Tmp[0].c = 15; printf("a: %d\n", a); printf("b: %d\n", b); printf("c: %d\n", Tmp[0].c); printf("NUM:%d\n", NUM); aaa(); bbb(); getch(); return 0; } ////////////////// // A.cpp ///////////////// #include <stdio.h> #include "define.h" void aaa( void ){ printf("a: %d\n", a); printf("b: %d\n", b); printf("c: %d\n", Tmp[0].c); printf("NUM:%d\n", NUM); } ////////////////// // B.cpp ///////////////// #include <stdio.h> #include "define.h" void bbb( void ){ printf("a: %d\n", a); printf("b: %d\n", b); printf("c: %d\n", Tmp[0].c); printf("NUM:%d\n", NUM); } ////////////////// // define.cpp ///////////////// #include "define.h" int a = 10; int b = 20; struct Parameter { int c; }; struct Parameter Tmp[NUM]; ////////////////// // define.h ///////////////// #define NUM 100 extern int a; extern int b; extern struct Parameter Tmp[NUM]; void aaa( void ); void bbb( void );

  • VisualC++のプリプロセッサ定義とビルド関係

    VisualC++のプロジェクトには「#define _MYDEBUG」というプリプロセッサと同じ働きをするプリプロセッサ定義という設定項目がプロジェクトのプロパティにありますが、これらがコンパイラによって使用されるタイミングはどのようなものでしょうか? VisualC++コンパイラがソースパーズ時にプロジェクトのプリプロセッサ設定を参照しに行ってコンパイル結果に反映させるといったことが行われているのでしょうか?

  • 【VS2008 C++】2つのプロジェクト間で共通の関数を使いたい

    【VS2008 C++】2つのプロジェクト間で共通の関数を使いたい WindowsXP上で visual studio 2008 C++ express editionを 使用しています。 1つのソリューションに2つのプロジェクトをつくり、 その2つに共通の関数を使用させたいのですが、どのように 設定すればよいか教えて頂けませんでしょうか。 ソースの内容は以下のとおりです。 具体的には、mainB.cppでcommon.cppの関数を 呼び出したいです。 //common.cpp #include <stdio.h> void showCommon(){ printf("---common-----\n"); } //common.h #include<stdio.h> void showCommon(); //mainA.cpp #include<stdio.h> #include "common.h" void main(){ printf("---mainA-----\n"); showCommon(); } //mainB.cpp #include<stdio.h> #include "common.h" void main(){ printf("---mainB-----\n"); showCommon(); }

  • プリプロセッサの上手な使い方を教えて下さい

    美しいソースを書けるようになりたくて日々自分のソースを見直しています。現在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を使いまわす (以下、省略)

  • C言語

    以下のようなhello.cがあります。 include<stdio.h> int main(void) { printf("Hello World! \n"); return 0; } gcc -E hello.c と打つとプリプロセッサが表示されます。 課題はこの中からprintfに関するものを見つけ、読み取れることを説明せよとのことです。 問題の意図と解き方がわかりません。 よろしくお願いします。 環境はwsl ubuntu です。

  • Visual C++ 2008 Express Edition でステップ実行ができない

    たとえば、以下のソースコード 1: #include <stdio.h> 2: void hoge() 3: { 4:   printf("hogehoge\n"); 5: } 6: void main() 7: { 8:   hoge(); 9: } 普通は、F11でステップ実行すると、 7→8→3→4→5→9→終了 と流れていくと思いますが、 7→終了 とステップインがうまく動作していないようなのです。 この現象についてご存知の方、修復方法を教えていただけるとありがたいです。

  • サブ関数、メイン関数

    C言語の質問です! ランダムに九九の計算を出題して、キーボードから答えを入力し、正解かどうかを判定するプログラムをつくりたいです。出題の部分をサブ関数、判定の部分をメイン関数として作成する場合、どのようなプログラムの書き方になるのか、教えてください! #include<stdio.h> #include<stdlib.h> #include<process.h> void kakezan(void); void answer(void); void hanrei(void); int a,b,c; int main() { printf("やめるときは、100と入力してください。\n");   while(1){ kakezan(); answer(); hantei(); } return 0; } void kakezan(void) { a=rand() %10; b=rand() %10; printf("%d×%d=",a,b); } void answer(void) { scanf("%d",&c); if(c==100) exit(0); } void hantei(void) { if(c==a*b) printf(">>正解\n"); else printf(">>不正解\n"); printf("\n"); return; } 一応考えてみたのですが、 ちゃんと、判定→メイン  出題→サブ関数になっているのかなとおもって・・・   このプログラムであっているのでしょうか??

  • テンプレート関数に関して質問です。

    テンプレート関数に関して質問です。 wstringとstringに対して、似たような処理を行いたいので、template関数を使ってうまく定義できないかと思ったのですが、例えば、 #include<string> template<class T> void hoge(T &s){ s="a"; } void main(void){ std::string str; hoge(str); } の場合、class TがwstringだとL"a"としないといけないのですが、Tによってこれを変えることは可能でしょうか? また、できれば、hogeに想定外の変数を入れられたくないので、hogeをtypedefのようなのりで、 void foo(std::string &s); void foo(std::wstring &s); と定義しておきたいのですが何か良いアイデアはないでしょうか? 当然、hogeはstaticグローバル変数のように外部からはアクセスできないようにしておきたいのです。 よろしくお願いします。