2016-04-28 49 views
2

Visual StudioツールメニューからVS2012 ARM Developer Promptを使用しています。そして、それは、その結果<winapifamily.h>と "致命的なエラーC1012:不一致括弧:missing ')'

#if defined(CRYPTOPP_WIN32_AVAILABLE) && defined(WINAPI_FAMILY) 
# if !(WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)) 
# undef SOCKETS_AVAILABLE 
# endif 
#endif 

:私は以下のコードでマクロを使用しています。

cl.exe /nologo /W4 /D_MBCS /Zi /TP /EHsc /MD /DWINAPI_FAMILY=WINAPI_FAMILY_PHONE_APP /c wait.cpp 
wait.cpp 
c:\...\config.h(548) : fatal error C1012: unmatched parenthesis : missing ')' 
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio 11.0 
\VC\BIN\x86_ARM\cl.exe"' : return code '0x2' 

ライン548は#if !(WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP))ある

#ifブロックを削除すると、一致しない括弧の即時エラーはクリアされますが、ソケット関連のエラーが他の場所で発生します。だから私は、WindowsストアとWindows Phoneのアプリケーションを検出し、コードパスを無効にできるようにしなければなりません。

正確には、この比類のないカッコがありますが、どうすれば修正できますか?


<winapifamily.h>の関連ビットは次のとおりです。それはWIndows Phone Kitから出てきます。私はかなり期待しています。

/* 
* Windows APIs can be placed in a partition represented by one of the below bits. The 
* WINAPI_FAMILY value determines which partitions are available to the client code. 
*/ 

#define WINAPI_PARTITION_DESKTOP 0x00000001 
#define WINAPI_PARTITION_APP  0x00000002  

/* 
* A family may be defined as the union of multiple families. WINAPI_FAMILY should be set 
* to one of these values. 
*/ 
#define WINAPI_FAMILY_APP   WINAPI_PARTITION_APP 
#define WINAPI_FAMILY_DESKTOP_APP (WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_APP) 

/* 
* A constant that specifies which code is available to the program's target runtime platform. 
* By default we use the 'desktop app' family which places no restrictions on the API surface. 
* To restrict the API surface to just the App API surface, define WINAPI_FAMILY to WINAPI_FAMILY_APP. 
*/ 
#ifndef WINAPI_FAMILY 
#define WINAPI_FAMILY WINAPI_FAMILY_DESKTOP_APP 
#endif 

/* Macro to determine if a partition is enabled */ 
#define WINAPI_FAMILY_PARTITION(Partition) ((WINAPI_FAMILY & Partition) == Partition) 

/* Macro to determine if only one partition is enabled from a set */ 
#define WINAPI_FAMILY_ONE_PARTITION(PartitionSet, Partition) ((WINAPI_FAMILY & PartitionSet) == Partition) 

/* 
* Macro examples: 
* The following examples are typical macro usage for enabling/restricting access to header code based 
* on the target runtime platform. The examples assume a correct setting of the WINAPI_FAMILY macro. 
* 
*  App programs: 
*   Explicitly set WINAPI_FAMILY to WINAPI_PARTITION_APP (cannot access DESKTOP partition) 
*  Desktop programs: 
*   Leave WINAPI_FAMILY set to the default above (currently WINAPI_FAMILY_DESKTOP_APP) 
* 
*  Note: Other families and partitions may be added in the future. 
* 
* 
* The WINAPI_FAMILY_PARTITION macro: 
* Code-block is available to programs that have access to specified partition. 
* 
*  Example: Available to App and Desktop programs 
*   #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) 
* 
*  Example: Available to Desktop programs 
*   #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) 
* 
* 
* The WINAPI_FAMILY_ONE_PARTITION macro: 
* Code-block is available to programs that have access to specified parition, but not others in the partition set. 
* 
*  Example: Available only to App programs 
*   #if WINAPI_FAMILY_ONE_PARTITION(WINAPI_FAMILY, WINAPI_PARTITION_APP) 
* 
*  Example: Available only to Desktop programs 
*   #if WINAPI_FAMILY_ONE_PARTITION(WINAPI_FAMILY, WINAPI_PARTITION_DESKTOP) 
* 
*  Example: Available to App, but not Desktop programs 
*   #if WINAPI_FAMILY_ONE_PARTITION(WINAPI_FAMILY_DESKTOP_APP, WINAPI_PARTITION_APP) 
*/ 
+0

ソースコードの最初の行(#include行/ #includeまで)を投稿できますか? –

+0

問題ではない:C++コード( '/ TP')としてコンパイルされていますが、これはCとタグ付けされています。'/w44668'でコンパイルしてみてください([C4668](https://msdn.microsoft.com/ja) -us/library/4dt9kyhy.aspx)/ GCCの '-Wundef')。私の推測では、 'WINAPI_FAMILY_PARTITION'は定義されていません。 – cremno

+1

ああ、おそらく 'WINAPI_PARTITION_DESKTOP'も定義されていません。これはあなたが '#if!(0(0))'で終わることを意味します。 – cremno

答えて

2

<winapifamily.h>はデフォルトでは含まれていません。それを含まない場合は(好ましくは#includeを経由して/FIもオプションです)、プリプロセッサはWINAPI_FAMILY_PARTITIONWINAPI_PARTITION_DESKTOP0に置き換えます。これは

# if !(WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)) 

これは、有効な前処理表現ではありません

# if !(0(0)) 

と同等であることを意味します。このような間違いは、コンパイラ/プリプロセッサに診断を出すように指示することで見つけることができます。 MSVCはC4668です。これはレベル4の警告ですが、デフォルトではオフです。したがって、/w44668で有効にする必要があります。 GCCは-Wundefです。

+0

ありがとうございます。私はかなりこのMicrosoftのいたずらのすべてが壊れていると確信しています。 3年前、私はVisual Studio Ultimate、2つのSurfaceタブレット(ARM/WinRTとPro/x64)、Windows Phone、新しいラップトップを買った。購入した実際のハードウェアを実行する予定だったのですが)。私が言うことができる最高の、私は何もない約8000ドルを費やした。 *問題143:ユニバーサルWindowsプラットフォーム(UWP)のサポート*および*問題164:Windows用のBCryptGenRandomに基づくノンブロッキングRNGが必要なバグをクリアすることはできません。ツールはまだ壊れています。 – jww

+0

+1これは、このエラーメッセージをプリプロセッサディレクティブであった実際の原因にリンクしている唯一のものだからです。 – CPlayer