[C] 一些data type

今天在看一個源碼時對一個 data type "uintptr_t" 不了解, google之後發現原來他是有作用的, 來筆記一下.

linux man page可以知道他的宣告是
typedef unsigned int unit16_t;
typedef uint16_t uintptr_t;

源自
主要作用是為了再跨平台時, 程式碼可以保存不受破壞.
以下是在x86 debian下跑的結果
printf("signed char:%d\n", sizeof(signed char));
printf("signed short:%d\n", sizeof(unsigned short));
printf("signed int:%d\n", sizeof(signed int));
printf("size_t:%d\n", sizeof(size_t));
printf("signed long:%d\n", sizeof(signed long));
printf("signed long long int:%d\n", sizeof(signed long long int));

debian:/home/xxx/shares/C# ./test_datatype
signed char:1
signed short:2
signed int:4
size_t:4
signed long:4
signed long long int:8


另外是一個很神(或說機車)的寫法...

[Symbol.h]
extern char *symbol_values[];
#define SYMBOL_NAME_ENUM(name) symbol_##name
#define SYMBOL(name) symbol_values[SYMBOL_NAME_ENUM(name)]
...
...
#define SYMBOLS_DO(action) \
/* Method and field names, etc. */\
action(f, "f"), \
action(m, "m"), \
...
enum {
SYMBOLS_DO(SYMBOL_ENUM),
MAX_SYMBOL_ENUM
};
-----------------------------------------------------------
[Symbol.c]
#define SYMBOL_VALUE(name, value) value
char *symbol_values[] = {
SYMBOLS_DO(SYMBOL_VALUE)
};

這是關於c裡頭前置處理中的macro代有引數時的用法, 其定義為
#define macroname(arg1[,arg]) string1 arg1
一開始是程式呼叫了 SYMBOL(m), by#define SYMBOL(name) symbol_values[SYMBOL_NAME_ENUM(name)]
=> symbol_values[SYMBOL_NAME_ENUM(m)], by#define SYMBOL_NAME_ENUM(name) symbol_##name
=> symbol_values[symbol_##m], 這邊我舊卡住了...
不過偷看一下symbol_values的宣告: char *symbol_values[],
可以推斷 symbol_##m 應該是一個enum, 然後回傳值是action(key, value)裡頭的value.
(怎有那麼噁心的寫法... 先記錄一下, 哪天或許會懂...)

Comments

Popular posts from this blog

股票評價(Stock Valuation) - 股利折現模型

openwrt feed的使用

How to convert Markdown into HTML