2017-08-25 19 views
-1

我寫了這個簡單的程序無與倫比paranthesis:在#if指令中缺少「)」

#include <time.h> 
int main() 
{ 
#if ((clock_t)1000) 
    int x = 10; 
#endif 
    return 0; 
} 

在編譯時,我看到了以下錯誤:

Error C1012 unmatched parenthesis: missing ')'

有人能告訴我爲什麼我得到這個錯誤?

下更改線路:

#if ((clock_t)1000)

到:

#if (clock_t)1000 

解決了編譯錯誤。

但由於((clock_t表示)1000)被定義爲使用在limits.h中頭文件作爲#define指令宏我不能做到這一點,:

#define CLOCKS_PER_SEC ((clock_t)1000) 

,我需要使用直接。

有人能幫我解決這個錯誤嗎?


編輯:

請原諒我在這樣一個不明確的方式制定的問題。 重新定義我現在的問題:

我有以下代碼:

#include <time.h> 
#define DUMMY_CLOCKS_PER_SEC ((clock_t)1000) 
int main() 
{ 
#if CLOCKS_PER_SEC != DUMMY_CLOCKS_PER_SEC 
    #error "out of sync" 
#endif 
    return 0; 
} 

但這給人的編譯錯誤:

Error C1012 unmatched parenthesis: missing ')'

有人可以幫助我解決這個錯誤嗎?

+4

預處理器使用它自己的簡單的語言是無關的C++。您不能將C++符號或類型名稱(如'clock_t')用作預處理器表達式的一部分。而且你當然不能使用預處理器來執行C++表達式,包括強制轉換。 –

+11

你能告訴我們什麼'#if((clock_t)1000)'應該做什麼? – user463035818

+0

注意預處理器只能編譯時確定。它用於定義符號,控制編譯的內容以及文本替換 – sp2danny

回答

1

((clock_t)1000) is defined as a macro using the #define directive in the limits.h header file as :

#define CLOCKS_PER_SEC ((clock_t)1000) 

該文件未定義名爲((clock_t)1000)的宏。它定義了一個名爲CLOCKS_PER_SEC的宏。 ((clock_t)1000)是宏的值。

((clock_t)1000)不是一個宏,是不能在#if指令中使用的東西。

+0

我使用錯誤的術語的appologies。我用正確的術語更新了這個問題。 –

3

預處理器不知道C++數據類型的任何內容,也不理解轉換表達式。它用於簡單文本處理,並且==!=只能比較單個令牌。

在C++中進行比較,而不是預處理器。

static_assert(CLOCKS_PER_SEC == DUMMY_CLOCKS_PER_SEC, "out of sync"); 
int main() { 
    return 0; 
} 

不要擔心運行時性能開銷。由於這兩個宏擴展爲文字,編譯器會優化它。

+0

我不能這樣做,因爲不是返回10,我需要定義#error宏。 –

+0

然後我覺得你運氣不好。 'CLOCKS_PER_SEC'不打算用於預處理器表達式,它是針對C/C++的。請參閱https://gcc.gnu.org/onlinedocs/gcc-4.0.4/cpp/If.html#If瞭解預處理程序'#if'表達式中允許的內容。 – Barmar

+1

一點也不好運。你可以簡單地使用'static_assert(CLOCKS_PER_SEC == DUMMY_CLOCKS_PER_SEC,「你的錯誤信息在這裏);'而不是'#if'和'#error'。 –

2

你與它的擴展混亂預處理宏定義(CLOCKS_PER_SEC)(即實現定義,對你來說似乎是((clock_t)1000))。

這是不是很清楚你想要在你的代碼中做什麼。

如果要檢查,如果該宏被定義,你可以使用預處理#ifdef,如:

#ifdef CLOCKS_PER_SEC 
    // your code 
#endif 

無論如何,這CLOCKS_PER_SEC macro是由標準定義,所以它應該在標準中總是被定義-compliant time.h庫的實現。

如果您有不同的想法,請澄清您的目標。

編輯根據您在下面澄清評論,你可能需要使用一個if比較這兩個宏的值(擴展):

if (DUMMY_CLOCKS_PER_SEC != CLOCKS_PER_SEC) { 
    ... 
} else { 
    ... 
} 
+0

我已經定義了我自己的DUMMY_CLOCKS_PER_SEC爲 #define DUMMY_CLOCKS_PER_SEC(((clock_t)1000),我需要使用#if CLOCKS_PER_SEC!= JP_CLOCKS_PER_SEC來比較2個宏CLOCKS_PER_SEC和DUMMY_CLOCKS_PER_SEC。但是,做這個比較會產生問題中定義的編譯錯誤,我試圖解決這個問題。 –

+0

@VarunKalra:好的,所以它聽起來像你需要使用一個簡單的'if'語句。 –

0

感謝所有的答覆大家。

我發現這個問題的另一個解決方案是使用constexpr說明符,這是C++ 11的一個特性。 ConstExpr允許我們在編譯時評估變量或函數的值。

從改變代碼:

#if CLOCKS_PER_SEC != DUMMY_CLOCKS_PER_SEC 
    #error "out of sync" 
#endif 

爲以下解決此問題:

constexpr int DUMMY_CLOCK_NOT_EQUAL = (DUMMY_CLOCKS_PER_SEC != CLOCKS_PER_SEC) ? 1 : 0; 
#if DUMMY_CLOCK_NOT_EQUAL 
#error "out of sync" 
#endif