-
-
Call by reference: C++ 另外支援此種方法。C 可以用傳遞指針 (仍為 call by value,value 為位址) 模擬 call by reference 的效果。
-
前處理器
常見問題
-
-
-
-
GCC 可以加上
-fno-common
選項,要求將多個且重名的未初始化全域變數產生至 .bss 段,最後交由鏈結器報錯。
$ gcc -fno-common main.c foo.c
/tmp/ccBPsu3u.o:(.bss+0x0): multiple definition of `g_val'
/tmp/ccf5NmfA.o:(.bss+0x0): first defined here
collect2: error: ld returned 1 exit status
-
Unix C compilers have traditionally permitted multiple definitions of such variables in different compilation units by placing the variables in a common block. This is the behavior specified by -fcommon, and is the default for GCC on most targets. On the other hand, this behavior is not required by ISO C, and on some targets may carry a speed or code size penalty on variable references.
注意,ISO C 只是不要求編譯器編譯多個且重名的未初始化全域變數,而非像 C++ 禁止。
-
-
-
C
Ch1. C Through the Mists of Time
Ch2. It’s Not a Bug, It’s a Language Feature
Ch3. Unscrambling Declarations in C
typedef 閱讀方式和宣告一樣,為已有型別引入別名。
// 看到 string,就是 char *。
typedef char * string;
// 常應用於簡化函式指針。
void (*signal(int sig, void (*func)(int)))(int);
// sig_t 是一個指針,指向一個參數為 int,返回值為 void 的函式。
typedef void (*sig_t) (int);
// signal 接受一個 int 和一個 sig_t, 返回 sig_t。
sig_t signal(int sig, sig_t func);
-
Ch 4. The Shocking Truth: C Arrays and Pointers Are NOT the Same!
常見問題
語言相關
#include <stdio.h>
int main()
{
// 將整型 (int) -1,即 ffffffff,轉型成 size_t,進而得到 size_t 的最大值。
// (~(size_t)0)
size_t length = (size_t)-1;
printf("max value of size_t: %zu\n", length);
printf("sizeof(size_t): %lu\n", sizeof(size_t));
}
// $ cat /proc/`pidof mmap`/maps
// 00000000-100000000 rwxp 00000000 00:00 0
// 100000000-100001000 r-xp 00000000 00:0f 24080529 /nfs_home/chenwj/tmp/mmap
#include <sys/mman.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
// 4 * 1024 * 1024 * 1024 的寫法,會因為 4 預設型別為 int 而導致 overflow。
#define DEFAULT_CODE_GEN_BUFFER_SIZE (4UL << 30)
int main()
{
void *ptr;
size_t code_gen_buffer_size = DEFAULT_CODE_GEN_BUFFER_SIZE;
int flags = MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED;
// gcc -Wl,-Ttext-segment=0x100000000 -fPIE -pie hello.c -o hello
// mmap 映射虛擬位址 4G 以下所有空間。
ptr = mmap(0, code_gen_buffer_size,
PROT_WRITE | PROT_READ | PROT_EXEC,
flags, -1, 0);
if (ptr == MAP_FAILED)
{
printf("mmap failed!\n");
abort();
}
printf("ptr: 0x%016lx\n", (unsigned long)ptr);
sleep(100);
}
有關C語言的struct進階初始化typedef struct _stu {
char name[12];
int id;
} stu;
stu jenny;
strutc _stu zakk;
-
Using boolean values in Ctypedef enum { false, true } bool;
int main()
{
const bool char_is_signed = (char)-1 < 0;
if (char_is_signed)
{
printf("signed char\n");
}
else
{
printf("unsigned char\n");
}
}
-
fscanf 讀取字串以空白為界,欲達到讀取一行的字串。
#include <stdio.h>
FILE *my_file_ptr = fopen("some/path/file.txt", "r");
if (my_file_ptr != NULL) {
char line[300];
// Read anything that is not line end, until line end is encountered.
while (fscanf(my_file_ptr, "%[^\n]\n",line) != EOF) {
printf("%s", line);
}
}
-
透過 shift 和 mask 達成。
unsigned char bytes[4];
unsigned long n = 175;
bytes[0] = (n >> 24) & 0xFF;
bytes[1] = (n >> 16) & 0xFF;
bytes[2] = (n >> 8) & 0xFF;
bytes[3] = n & 0xFF;
工作學習
轉換編碼
其它
外部連結