2014-02-16 106 views
-1

從時間翻翻代碼時的時候,我看到人們寫的線路,如:有沒有辦法讓事情做點什麼,做任何事情?

something; 

人們總是說這樣的聲明是愚蠢的,什麼都不做。我開始懷疑C++是否有辦法讓它做任何事情。

單詞陳述在C++中定義得很好。所以我實際上有兩個問題:

  1. 有沒有辦法讓這樣的一行做任何事情,而不使用宏?
  2. 有沒有辦法讓東西成爲一個對象,所以something;實際上是一個標識符語句(我希望我理解並正確使用這個詞),並且做任何事情。我猜想一個宏使它不是一個標識符聲明。

所以代碼示例使用宏:

something.cpp:

#include <iostream> 
int main() { 
    #include "something.hpp" 
    something; 
    return 0; 
} 

something.hpp:

#define something std::cout<<"It's something!\n" 

當然然後something;做一些事情。

有沒有一種方法可以實現something.hpp,以便它不使用宏,並且最好定義一些類並使something成爲它的一個實例並執行用戶編寫的代碼。

include的位置。是故意選擇的,所以可以注入任何代碼。 E.g:

class T{}; 
T something; 

注意,我相信,我的第二個問題是由templatetypedef誰解決問題的以前版本的回答。

+0

關於#4,它是*表達式語句*。實際上,null語句也是一個表達式語句,但沒有表達式,表達式是可選的。 – chris

+1

真的不是很清楚你在問什麼。你能否包含一些實際的代碼?你是否真的只是想知道是否有可能有'標識符'''做些什麼?你什麼時候會在真實代碼中遇到過這個問題?你說「不時」,好吧,如果是這樣的話,大概這個代碼*會做一些事情,你應該把它包括在這裏。 – meagar

+0

我不明白這個問題。你是否在問如何給語言中沒有意義的語句賦予意義? –

回答

5

我有一份C++ 11 ISO標準草案,我認爲我們可以放心地說答案是否定的。表格說明

identifier; 

是一個表達式語句。規範(§ 6.2.1)說

該表達式被評估,並且其值被丟棄。

那麼表達式identifier的計算結果是什麼呢?那麼,這是一個標識符表達式,其規格(§ 5.1.1/6)說

結果是由標識符表示的實體。

所以這個表達式的作用是「評估由identifier給出的實體,然後丟棄結果。「沒有這裏涉及到的選擇,所以這個表達式應該始終沒有效果。

希望這有助於!

+0

有沒有一種方法可以定義或輕觸此評估?結果被丟棄的事實是不夠的,逗號運算符也是有用的。我在想,也許可以定義某種操作符來定義這種語句的行爲。 – luk32

+0

@templatetypedef - 它確實有效果。使用CPU,時間和內存。只是迂腐! –

+0

@EdHeal你確定嗎?如果表達式沒有效果,編譯器完全可以自由優化它。 – templatetypedef

0

並非所有的表達語句空操作。他們可以是空操作,如果他們有沒有副作用或如果他們是一個空語句,例如:

vector.size(); // Did nothing with the variable 
; // null statement 
0; // Random zero in the middle of code, confuse readers galore 
    // or use as a breakpoint 
doSomething(); // Do something 

所以你的情況,我不明白爲什麼一個學生將通過自己寫一個變量,然後分號任何實際的理由,除非它是一個錯字或用作斷點

+0

我不是說他們知道他們在做什麼=)。這是一個無所作爲的代碼。我剛剛看到這樣的代碼不止一次。我想知道是否有一種方法來定義這種語句的行爲。 – luk32