1

私は自分のプログラムのソースをクロスプラットフォームにしたいと思っています。構文だけが実際に異なる関数がいくつかあるので、最初にいくつかの定義をチェックして、Windows か Linux かを確認し、どちらであるかに応じて変数を 1 または 0 に設定しています。私の考えでは、その変数に対してifステートメントチェックを実行して、間違った構文の使用をスキップできると考えました。コンパイラがまだ問題のあるコードを「認識」しているため、コンパイルできないことに気付きました。できますか

 #ifdef

特定の関数を区分してコード内で呼び出すには? 助言がありますか?

4

4 に答える 4

4

非クロスプラットフォーム セクション全体#ifdefをsで囲む必要があります。

例えば:

int gettimeofday(struct timeval *tp, void *tzp)
{
#ifdef WIN32

    struct _timeb timebuffer;

    _ftime(&timebuffer);
    tp->tv_sec = timebuffer.time;
    tp->tv_usec = timebuffer.millitm * 1000;

    return 0;

#else

    tp->tv_sec = time(NULL);
    tp->tv_usec = 0;

    return 0;

#endif
}

このように、問題のあるコードは前処理ステップで削除されるため、コンパイラは問題のコードを認識しません

于 2013-05-18T22:53:54.753 に答える
1

cpp -d M < /dev/null > somefileコンパイラから期待できるデフォルトの機能テストマクロ設定(#define値)を表示します-テストしたいマクロ(#ifdef)のもの。これをすべてのシステムで実行する必要があります。また、gcc などのデフォルトでマクロを追加するコンパイラもあります。

#ifdef _SUN_OS 
// put all Sun OS code here

#endif

すべてのプラットフォームを識別するマクロを見つける必要があります。

于 2013-05-18T22:57:51.753 に答える
1

もちろん可能です。少なくともコードの小さな部分については、これがほとんど標準的な方法です。より大きなチャンクの場合は、代わりにビルドシステムを使用し、プラットフォーム固有のコードを別のファイル (foo_win.c、foo_unix.c) に含めることをお勧めします。次に、OS に応じて、適切なものだけをコンパイルしてアプリケーションにリンクします。

OS、コンパイラ、アーキテクチャなどを伝えるプリプロセッサの定義がたくさんあります。Qtが OSまたはコンパイラを検出する方法を見てください。

于 2013-05-18T22:55:23.693 に答える
1

はい、最も単純なケースでは、たとえば foo() という関数を想定すると、そのようなことができます...

/* Are we on a Windows platform ? */
#if defined(_WIN32) || defined(_WIN64) || defined(__WINDOWS__) || defined(__TOS_WIN__)
void foo( ... ) {
   /* windows implementation */
}

/* Are we on a Linux platform ? */
#elif defined(__linux__) || defined(__linux) || defined(linux) || defined(__gnu_linux__)
void foo( ... ) {
   /* linux implementation */
}

/* Are we on a Unix platform ? */
#elif defined(__unix__) || defined(__unix) || defined(unix)         \
|| defined(__CYGWIN__) || ( defined(__APPLE__) && defined(__MACH) )
void foo( ... ) {
   /* unix implementation */
}

/* Are we on Unsupported platform? */
#else
void foo( ... ) {
   /* generic implementation */
}
#endif

もう 1 つのオプションは、さまざまなバージョンの関数を実装する各 OS にさまざまなヘッダー ファイルを用意し、条件付き#includeで適切なものを用意することです。

myproj_win32.h、myproj_linux.h、myproj_unix.h、myproj_generic.h と呼ばれるいくつかのヘッダー ファイルを想定すると、次のようなことができます...

/* Are we on a Windows platform ? */
#if defined(_WIN32) || defined(_WIN64) || defined(__WINDOWS__) || defined(__TOS_WIN__)
#include "myproj_win32.h"

/* Are we on a Linux platform ? */
#elif defined(__linux__) || defined(__linux) || defined(linux) || defined(__gnu_linux__)
#include "myproj_linux.h"

/* Are we on a Unix platform ? */
#elif defined(__unix__) || defined(__unix) || defined(unix)         \
|| defined(__CYGWIN__) || ( defined(__APPLE__) && defined(__MACH) )
#include "myproj_unix.h"
}

/* Are we on Unsupported platform? */
#else
#include "myproj_generic.h"
#endif

正しいバージョンの実装のみがコンパイルされます。より多くのオプションがありますが、それらはあなたが始めるのに十分なはずです.

編集

これは、一般的な C/C++ コンパイラ用の定義済みマクロへの便利なリンクです。

于 2013-05-18T23:06:55.710 に答える