2013-11-28 56 views
1

我想转换一个自定义的字符常量(在头文件中使用#define)持有一个端口号,为一个无符号的短整型(为了能够使用htons()来处理它获得网络Byte-订购)。 我在一个单独的头文件中定义了一个结构,将PORT,HOSTNAME和GAMEKINDNAME分组(我相信常量名称非常明了,它们都分别存储为char数组)。自定义字符数组常量类型转换为unsigned short?

初始化结构的规格如下所示:

struct Config configuration_parameters = { 
    .type_of_game = GAMEKINDNAME, 
    .hostname = HOSTNAME, 
    .port = (unsigned short) PORT 
    }; 

在编译时,我收到以下错误:

warning: cast from pointer to integer of different size
error: initializer element is not constant

我认为这可能是由以下事实引起的焦炭用途1字节的存储,而无符号短使用2字节的存储空间,这可能表示某种冲突......这种假设是否正确,如果是的话(或者即使不是),任何人都有如何解决这个问题的想法?

任何帮助,将不胜感激!

+0

为什么将它定义为字符常量?如果它是一个常量,并且你确实需要它是一个字符常量,那么定义第二个'#define PORT_S 80'(将varname和value替换为任何适合的值)并使用它。 – Jite

回答

1

我假设你的PORT声明看起来或多或少是这样的:

const char *PORT = "12345"; 

如果你投,要unsigned short你会投的价值,而是指针"12345"。使用像atoi这样的功能来实现:

struct Config configuration_parameters = { 
    .type_of_game = GAMEKINDNAME, 
    .hostname = HOSTNAME, 
    .port = 0 
    }; 
configuration_parameters.port = (unsigned short)atoi(PORT); 
+0

谢谢,那已经帮了大忙!现在错误信息发生了变化,但是我得到了以下结果:'config.c:13:error:初始化器元素不是常量' 'config.c:13:error :(接近'configuration_parameters.port'的初始化)'where line 13是struct的结尾,是最后的'};' –

+0

对不起。由于atoi是一个函数,你不能用它来初始化一个结构体。如果你可以用'0'初始化'port'并且在它之后初始化它? (我会相应地更改帖子) – user1781290

+3

如果你正在初始化任何函数之外的configuration_parameters结构体,你将不能使用任何函数调用来完成它。你可以将PORT定义为一个整数(老实说,我不确定你为什么要把它定义为一个字符串)。 –

相关问题