相关疑难解决方法(0)

是否有一个Objective-C等同于C#的'var'关键字?

非常明确支持在C#中使用'var'关键字.例如,而不是......

ThisIsMyReallyLongFooClassName foo = new ThisIsMyReallyLongFooClassName();
Run Code Online (Sandbox Code Playgroud)

我可以输入这个......

var foo = new ThisIsMyReallyLongFooClassName();
Run Code Online (Sandbox Code Playgroud)

...而且我还有一个强类型的变量.出于所有意图和目的,这两者是平等的.后者只是更具可读性(同样,因为它很明显.有些情况下它不是,'var'不应该被使用.但是我不希望这成为对它的讨论.)

我想知道Objective-C是否有类似的东西.

var type-inference objective-c

15
推荐指数
4
解决办法
4794
查看次数

便携式数据重新解释

我想以便携方式(C99)将一种类型的数据重新解释为另一种类型.我不是在谈论铸造,我想重新解释一些给定的数据.此外,通过便携式我的意思是它不会破坏C99规则 - 我并不是说重新解释的值在所有系统上都是相同的.

我知道3种不同的重新解释数据的方法,但其中只有两种是可移植的:

  1. 这不是便携式的 - 它打破了严格的别名规则.

    /* #1 Type Punning */
    
    float float_value = 3.14;
    int *int_pointer = (int *)&float_value;
    int int_value = *int_pointer;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 这是依赖于平台的,因为它int在写入之后从联合中读取值float.但它不会破坏任何C99规则,所以它应该工作(如果sizeof(int) == sizeof(float)).

    /* #2 Union Punning */
    
    union data {
      float float_value;
      int int_value;
    };
    
    union data data_value;
    data_value.float_value = 3.14;
    int int_value = data_value.int_value;
    
    Run Code Online (Sandbox Code Playgroud)
  3. 应该没问题,只要 sizeof(int) == sizeof(float)

    /* #3 Copying */
    
    float float_value = 3.14;
    int int_value = …
    Run Code Online (Sandbox Code Playgroud)

c type-punning

14
推荐指数
1
解决办法
2860
查看次数

链接静态库时内联函数的多个定义

我有一个C++程序,我用mingw编译(gcc for Windows).使用包含gcc 4.4.1的mingw的TDM版本.可执行文件链接到两个静态库(.a)文件:它们是用C编写的第三方库; 另一个是由我编写的C++库,它使用C库提供我自己的C++ API.

在我看来,(在我看来,过多)部分C库的功能是在内联函数中实现的.当你使用C库的API时,你无法避免包含内联函数,但当我尝试将它们全部链接在一起时,我会收到链接错误,说明所有内联函数都有多个定义 - 我都有在我的C++包装器库中调用,而我没有调用它,基本上在头文件中内联定义的任何内容都在C库和C++库中为它创建了一个函数.

当包含文件在同一项目中的不同.c或.cpp文件中多次使用时,它不会导致多个定义错误; 问题只是它为每个库生成一个定义.

编译器如何/为什么在两个库中为这些内联函数生成函数和符号?如何强制它停止在我的代码中生成它们?是否有一个工具可以运行以从.a文件中删除重复的函数,或者是一种使链接器忽略多个定义的方法?

(仅供参考,第三方库在其所有标题中都包含#ifdef __cplusplus和extern"C"保护;无论如何,如果这是问题,它不会导致符号的多重定义,它会导致相反的问题,因为符号会不确定或至少不同.)

值得注意的是,如果我链接到第三方C库的DLL,则不会发生链接错误; 然而,我得到奇怪的运行时故障似乎与我的代码有关,它应该从DLL调用自己的函数版本.(好像编译器正在创建我没有要求的本地版本的函数.)

之前已经问过这个问题的类似版本,但是,我没有找到任何这些问题的答案:

这个问题的答案是海报是多个定义变量,我的问题是内联函数的多重定义: 重复多重定义错误在多个cpps中包含相同的标题

这是一个MSVC计划,但我正在使用mingw; 另外,海报在这个问题中的问题是在标题中类主体之外定义C++类构造函数,而我的问题是内联的C函数: 静态Lib多重定义问题

这个傻瓜将他的所有C代码重命名为C++文件,他的C代码不是C++ - 安全:链接时 多个std :: functions的多个定义

这个只是想知道为什么违反一个定义规则不是错误: 具有不同定义的内联函数的不可预测的行为

c c++ linker-errors inline-functions tdm-mingw

12
推荐指数
1
解决办法
2万
查看次数

c/c ++ strptime()不解析%Z时区名称

我是C的新手.当我练习C来隐蔽时间来刺激来回构造tm时.我注意到了一些差异.请告诉我做错了什么.

#include <string.h>
#include <stdio.h>
#include <time.h>

/* 
test different format string to strptime
" %A, %b %d, %X %z %Y "
" %A, %b %d, %X %Z %Y "
*/
int main(int argc,char *argv[])
{

   char date[] = "6 Mar 2001 12:33:45";
   char fmt[80];
   struct tm tm;

   if (argc==1) return 0;
   strcpy(fmt,argv[1]);
   memset(&tm, 0, sizeof(struct tm));
   if (strptime(date,"%d %b %Y %H:%M:%S",&tm)==NULL) printf("error\n");
   char buf[128];
   strftime(buf, sizeof(buf), fmt, &tm);
   printf("%s\n", buf);
   printf("%d\n", tm.tm_isdst);
   if (strptime(buf,fmt,&tm)==NULL) printf("error\n");
   else {
   printf("year: %d; …
Run Code Online (Sandbox Code Playgroud)

c timezone strptime timestamp-with-timezone

5
推荐指数
1
解决办法
6838
查看次数