我在不同的帖子中读到,通过执行以下操作可以将结构的实现隐藏在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中构建了一个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接口和实现".书中描述了一些非常有趣的概念.有时(在我看来)代码非常难看,但现在我有一个关于将整数/长转换为字符串(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)