小编inz*_*nez的帖子

C - 隐藏结构的实现

我在不同的帖子中读到,通过执行以下操作可以将结构的实现隐藏在C中:

test.h:

typedef struct SomeTest *SomeTest;
SomeTest make();
Run Code Online (Sandbox Code Playgroud)

test.c的:

#include "test.h"
typedef struct SomeTest {
    int data;
}*SomeTest;
Run Code Online (Sandbox Code Playgroud)

我不知道的是:线路是:

typedef struct SomeTest *SomeTest;
Run Code Online (Sandbox Code Playgroud)

真的需要那种方式吗?是不是足够:

test.h:

   typedef struct SomeTest SomeTest;
   SomeTest *make();
Run Code Online (Sandbox Code Playgroud)

test.c的:

#include "test.h"
struct SomeTest {
    int data;
};
Run Code Online (Sandbox Code Playgroud)

就是这条线:

typedef struct SomeTest *SomeTest;
Run Code Online (Sandbox Code Playgroud)

有时令我头疼,......而且它隐藏了"SomeTest"是一个指针的事实......

c struct

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

C库 - 在C++中使用:重定义,不同的类型修饰符

我最近在纯C中构建了一个CSV库.头文件如下所示:

  #ifndef CSV_H
  #define CSV_H

    #include "unicode/ustdio.h"
    #include "unicode/uchar.h"
    #include "unicode/ucsdet.h"
    #include "unicode/ustring.h"

    #define T CSV_T
    typedef struct T *T;

    extern T    CSV_new(char *filename);
    extern void CSV_free(T *csv);
    extern int  CSV_length(T csv);
    extern void CSV_print_info(T csv);
    extern UChar **CSV_get_header(T csv);
    extern UChar ***CSV_get_values(T csv);
    extern long CSV_get_num_columns(T csv);
    extern long CSV_get_num_lines(T csv);
    extern char *CSV_get_charset(T csv);

    #undef T
    #endif
Run Code Online (Sandbox Code Playgroud)

struct CSV_T的实际定义在代码文件中完成,以隐藏实现.我经常在使用纯C的不同项目中使用该库,没问题.现在我想在使用C++构建的GUI应用程序中重用代码,并收到以下错误消息:

Error   C2373   'CSV_T': redefinition; different type modifiers     ... xxx\Projects\LibCSV\LibCSV\csv.h    10  
Run Code Online (Sandbox Code Playgroud)

C++是否处理了与C不同的typedef?混淆不清,......

c++ typedef redefinition

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

C编程 - 整数/长到字符串表示

我只是在阅读"C接口和实现".书中描述了一些非常有趣的概念.有时(在我看来)代码非常难看,但现在我有一个关于将整数/长转换为字符串(char数组)的问题.书中描述的是:

const char *Atom_int(long n) {
    char str[43];
    char *s = str + sizeof str;
    unsigned long m;
    if (n == LONG_MIN)
        m = LONG_MAX + 1UL;
    else if (n < 0)
        m = -n;
    else
        m = n;
    do
        *--s = m%10 + '0';
    while ((m /= 10) > 0);
    if (n < 0)
        *--s = '-';

    return Atom_new(s, str + sizeof str - s);
}
Run Code Online (Sandbox Code Playgroud)

因为没有描述为什么使用这个函数的方式......我想知道为什么它不仅仅是简单的东西:

const char *Atom_int(long n)
{
    char str[43];
    char *s = str;
    sprintf(str, …
Run Code Online (Sandbox Code Playgroud)

c arrays printf long-integer

-4
推荐指数
1
解决办法
119
查看次数

标签 统计

c ×2

arrays ×1

c++ ×1

long-integer ×1

printf ×1

redefinition ×1

struct ×1

typedef ×1