簡體   English   中英

C - 初始化程序與字符串文字不一致

[英]C - initializer not constant with string literal

我知道c中文件范圍的初始值設定項的限制:你不能使用變量(甚至const),函數等......但我真的不明白為什么這不起作用:

#include <stdlib.h>
#include <stdio.h>

//unsigned long a = "string"[0] > '0'; // this does not compile
unsigned long a = 's' > '0'; // this works fine, output is "a = 1"

int main(void)
{
    printf("a = %lu\n",a);

    return 0;
}

為什么帶有字符串文字的行給出:錯誤:初始化元素不是常量。 字符串文字不被視為常量嗎? 有沒有辦法使它工作?

提前致謝

您的變量具有靜態存儲持續時間,因此根據N1570(C11) §6.7.9/ p4

具有靜態或線程存儲持續時間的對象的初始值設定項中的所有表達式應為常量表達式或字符串文字。

字符串文字具有靜態存儲持續時間§6.4.5/ p6 ,因此它們的地址可以被視為常量表達式(這就是它們被允許作為初始化器的原因)。 但是你試圖在這樣的地址訪問該值,並且C標准明確禁止它。 引用§6.6/ p9 ,強調我的:

地址常量是空指針,指向靜態存儲持續時間的對象的左值的指針,或指向函數指示符的指針; 它應該使用一元&運算符或一個轉換為指針類型的整數常量顯式創建,或者通過使用數組或函數類型的表達式隱式創建。 array-subscript []和member-access。 和 - >運算符,地址&和間接*一元運算符和指針強制轉換可用於創建地址常量,但不能使用這些運算符訪問對象的值。

另一方面,當您使用字符常量進行比較時,您將獲得有效的常量表達式。

在C語言中,具有靜態存儲持續時間的對象必須使用常量表達式或包含常量表達式的聚合初始化程序進行初始化。

現在你基本上把"string"[0]作為一個常量表達式? 但是這樣嗎?

事情是從6.6p2

可以在轉換期間而不是運行時期間評估常量表達式,並且因此可以在常量可以在任何地方使用。

之后我檢查了翻譯階段及其組成部分:很明顯,沒有任何表達式被評估,這涉及到[]數組下標字符串文字。 這實際上涉及解除引用地址並獲得在翻譯階段無法做到的vlaue。 這就是為什么這個錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM