2

戻り値の型が不明な C 関数を (C コンパイラの警告なしで) 宣言できますか? 戻り値の型は、、、、intなどfloatです。doublevoid *

undetermined_return_type miscellaneousFunction(undetermined_return_type inputValue);

また、この関数を他の関数で使用して値を返すこともできます (ただし、実行時エラーになる可能性があります)。

BOOL isHappy(int feel){
    return miscellaneousFunction(feel);
};

float percentage(float sales){
    return miscellaneousFunction(sales);
};

私が探しているもの:

未定義の戻り値の型を持つ C 関数 (または Obj-C メソッド) を宣言して実装することは、アスペクト指向プログラミングに役立ちます。

実行時に別の関数で Obj-C メッセージをインターセプトできれば、そのメッセージの値を元の受信者に返すか、別のアクションを実行して返さないかです。例えば:

- (unknown_return_type) interceptMessage:(unknown_return_type retValOfMessage){
    // I may print the value here
    // No idea how to print the retValOfMessage (I mark the code with %???)
    print ("The message has been intercepted, and the return value of the message is %???", retValOfMessage);

    // Or do something you want (e.g. lock/unlock, database open/close, and so on).
    // And you might modify the retValOfMessage before returning.
    return retValOfMessage;
}

したがって、少し追加して元のメッセージを傍受できます。

// Original Method
- (int) isHappy{
    return [self calculateHowHappyNow];
}

// With Interception
- (int) isHappy{
    // This would print the information on the console.
    return [self interceptMessage:[self calculateHowHappyNow]];
}
4

4 に答える 4

3

タイプを使用できますvoid *

次に例を示します。

float percentage(float sales){
    return *(float *) miscellaneousFunction(sales);
}

自動保存期間を持つオブジェクトへのポインタを返さないようにしてください。

于 2013-09-14T17:11:05.213 に答える
1

プリプロセッサを使用できます。

#include <stdio.h>

#define FUNC(return_type, name, arg)        \
return_type name(return_type arg)           \
{                                           \
    return miscellaneousFunction(arg);      \
}

FUNC(float, undefined_return_func, arg)

int main(int argc, char *argv[])
{
    printf("\n %f \n", undefined_return_func(3.14159));
    return 0;
}
于 2013-09-14T17:44:42.043 に答える
1

thejhunionが示唆する可能性があります

typedef struct 
{
  enum {
      INT,
      FLOAT,  
      DOUBLE
  } ret_type;
  union
    {
       double d;
       float f;
       int i; 
    } ret_val;
} any_type;

any_type miscellaneousFunction(any_type inputValue) {/*return inputValue;*/}

any_type isHappy(any_type feel){
    return miscellaneousFunction(feel);
}

any_type percentage(any_type sales){
    return miscellaneousFunction(sales);
}

ここでret_type、戻り値のデータ型を知ることがret_type. i,f,dでき、対応する値を与えることができます。

すべての要素が同じメモリ空間を使用し、1 つのみにアクセスする必要があります。

于 2013-09-14T17:45:13.047 に答える
0

Straight C は静的に型付けされているため、動的に型付けされた変数 (バリアント) をサポートしていませんが、必要な機能を実行するライブラリがいくつかある可能性があります。

于 2013-09-14T17:14:59.743 に答える