2014-05-01 55 views
1

在C++的,我感興趣的聲明指針變量爲只讀,和我正在考慮這樣做,通過以下機制:範圍__declspec分配

#pragma section (".readonly", read) 
__declspec(allocate(".readonly")) 
VOID* g_pROData; // I want this to be read-only 

VOID* g_pRWData; // I want this to be read-write 

不過,我不知道的__declspec語句的範圍。它只包含g_pROdata,還是會包含g_pRWData?有什麼方法可以改變範圍嗎?

謝謝。

+0

const const –

+0

@ Cheersandhth.-Alf'const'不能保證是隻讀的 - 你可以(通常)將一個指針指向一個const數據項並寫入它。有時候你不能這樣做,實際上這是不確定的行爲,但是UB並不是任何有意義的行爲的保證,正如你可能已經知道的那樣。 –

+0

@MatsPetersson:這聽起來很合理,除了OP使用visual C++特定的指令。和Visual c + + [「常量變量的.obj文件中的默認段是.rdata」](http://msdn.microsoft.com/en-us/library/1dc22465.aspx),在那裏我瞭解rdata by默認是隻讀部分。 –

回答

1

完整的語法是:

__declspec(allocate("segname")) declarator 

所以它僅適用於聲明如下,以你的情況下,只有g_pROData影響和命名.readonly段分配。如果需要在該段中分配多個變量,則必須爲每個變量重複聲明。

+0

@lancery我想你知道,但是:在只讀部分分配的所有變量將是隻讀的。永遠,因爲只讀是由部分強制(而不是編譯器,你只是有一個弱const修飾符)。 –

+0

你知道標準允許你在一個只讀部分放置常量全局變量,對嗎? – Puppy

+0

@DeadMG是的,當然可以應用任何聲明。我的意思是隻讀部分中的變量(const或not)不能被修改(或「覆蓋」)。 –

0

A __declspec總是直接耦合到它之前的「對象」。

但是,你確定你想要一個只讀的void *嗎?究竟是什麼,你甚至不能設置指針。你的意思是你想讓你的指針指向一個只讀區段嗎?或者至少是初始化,例如VOID* g_pROData = ...