2

この質問の C++ バージョンがあることは知っていますが、テンプレートではなく標準の typedef を使用しています。

16 ビット wav ファイルで動作するプログラムを作成しました。各サンプルをショートにロードすることでこれを行います。次に、プログラムは short に対して算術演算を実行します。

現在、プログラムを修正して、16 ビットと 32 ビットの両方の wav を使用できるようにしています。条件付きの typedef を実行したいと考えていました。つまり、16 ビットの場合は short を、32 ビットの場合は int を使用します。しかし、変数の型が事前にわからない場合、コンパイラはおそらくコードをコンパイルしないことに気付きました。

そこで、次のコードをテストしようとしました。

#include <stdio.h>

int
main()
{
  int i;
  scanf("%i", &i);

  typedef short test;

  if(i == 1)
    typedef short sample;
  else 
    typedef int sample;

  return 0;
}

そして、次のコンパイラエラーが発生しました:

dt.c: In function ‘main’:
dt.c:12:5: error: expected expression before ‘typedef’
dt.c:14:5: error: expected expression before ‘typedef’

これは、C のランタイム条件付き typedef が不可能であることを意味しますか?

[自由回答形式の質問:] そうでない場合、このようなことをどのように処理しますか?

4

5 に答える 5

5

typedefはコンパイラ機能であるため、実行時に適用することはできません。

于 2012-07-18T12:25:12.623 に答える
3

プログラム内のすべての型は、コンパイル時に認識されている必要があります。

C++ では、テンプレートshortを使用してコードをコンパイルできます。intC では、マクロ (具体的には X マクロ) を使用してこれを行うことができます。

計算コードを eg という名前の別のファイルに入れてdt.tmpl.cから、次のようにdt.c記述します。

#define sample int
#include "dt.tmpl.c"

#define sample short
#include "dt.tmpl.c"

dt.tmpl.c次に、コードをプリプロセッサ トークンとして使用しsampleて、型に名前を付け、関数名に貼り付けることができます。次に例を示します。

#define PASTE(name, type) name ## _ ## type
#define FUNCTION_NAME(name, type) PASTE(name, type)

sample FUNCTION_NAME(my_calculation, sample)(sample i) {
    return i * 2;
}

これにより、2 つの関数が生成されint my_calculation_int(int i)short my_calculation_short(short i)他の場所で使用できます。

于 2012-07-18T12:29:41.027 に答える
2

まず第一に、typedefは新しい型ではなく、物事をより便利にするためのエイリアスまたは短い形式です(特に関数ポインターを操作する場合)

Cは静的言語であり、実行時に型を作成することはできません。型はコンパイル/リンク時に解決する必要があります。

可能であれば、WindowsAPIは非常に小さくなります:)

Windowsでは、ほとんどすべてのAPI呼び出しに対応する2つのバージョンの関数と、どちらを使用するかを決定する定義があります。

例えば

#ifndef UNICODE
#define myfunction _myfunctionA(TCHAR* p);
#else
#define myfunction _myfunctionW(TCHAR* p);
#endif

ただし、タイプはコンパイル時に決定されます

于 2012-07-18T12:28:47.860 に答える
2

一方、typedef一部の範囲でのみ使用できます。

int 
main(void) {
    if (1) {
        typedef short sample;
        sample n; // OK
    }
    sample u; // ERROR
    return 0;   
}
于 2012-07-18T13:22:59.683 に答える
0

C (および C++) の型はコンパイル時に固定されます。「ランタイムtypedef」の概念は C では意味がありません。

ただし、問題は注意して解決できます。2 つの関数 (および型) のセットを定義します。1 つは 16 ビット.wavファイルを処理し、もう 1 つは 32 ビット.wavファイルを処理します。これらはコンパイル時に定義され、型のサイズはコンパイル時に固定されますが、両方の多くのコードが実行可能ファイルに含まれ、実行に基づいて実行する関数のセットを選択できます。時間情報 (処理または生成するよう求められるファイルの種類)。

2 つの関数セットは対称である必要があります。「テンプレートのような」メカニズムを使用して、同じファイルを 2 回 (32 ビット コード用に 1 回、16 ビット コード用に 1 回) コンパイルして、関数名が一貫して変更されるようにすることができる場合があります。

于 2012-07-18T12:30:37.213 に答える