2012-02-22 61 views
5

在這行c代碼上陷入困境,但不確定它是否有效。它有什麼作用?變量有什麼類型?這個c代碼行做什麼? (const VAR =「string」;)

const VARNAME = "String of text"; 
+0

希望這[LINK1](http://publications.gbdirect.co.uk/c_book/chapter8/const_and_volatile.html),[LINK2](http://www.tutorialspoint.com/ansi_c/c_using_constants .htm)可以幫助你... – 2012-02-22 12:58:48

+2

只是出於好奇,你在哪裏遇到這個小憎惡? – 2012-02-22 13:09:07

回答

6

奇怪的是,我沒想到會編譯它,但它確實如此。但是,編譯器不喜歡太多:

..\main.c:4:7: warning: type defaults to 'int' in declaration of 'VARNAME' 
..\main.c:4:17: warning: initialization makes integer from pointer without a cast 

所以它確實需要INT爲默認類型,從而VARNAME有一個指針的值,因爲一個字符串的指針(後可以鑄成char *)。

這工作完全(一個Intel IA32的機器上):

#include<stdio.h> 

const VARNAME = "String of text"; 

int main() 
{ 
    printf("%s\n", (char*)VARNAME); 
    return 0; 
} 

但我個人不會用這樣的隱式類型。由於在下面的評論解釋說:

這是因爲的sizeof(int)的甚至是危險的可能會比 的sizeof(字符*)

+0

在你的環境中是的,但我相信'VARNAME'是在OP的代碼中定義的。 – moose 2012-02-22 13:01:54

+2

由於sizeof(int)'可能小於sizeof(char *)',所以它甚至是危險的。 – 2012-02-22 13:04:03

+0

這可能適用於你的盒子,但將指針存儲在int中具有實現定義的行爲。 – 2012-02-22 13:04:42

0

找到「VARNAME」的定義,你會看到。我會說「char *」。

2

什麼GCC嘗試做的是小:

  1. 使用默認類型,即int;
  2. 使此常量int包含一個指向字符常量的指針。

在我的機器上,它不能編譯,可能是因爲int是32位,指針是64位寬。

a.c:1: error: initializer element is not computable at load time