在这些语句中,两者都使用相同的编码(UTF-8)输入到源代码中并且语言环境设置正确,它们之间是否存在实际差异?
printf("? ??????????? ?? ???? ?????\n");
printf("%ls", L"? ??????????? ?? ???? ?????\n");
Run Code Online (Sandbox Code Playgroud)
因此有什么理由在做输出时更喜欢一个而不是另一个?我想第二个表现得差一点,但是它对多字节文字有任何优势(或劣势)吗?
编辑:这些字符串打印没有问题.但是我没有使用宽字符串函数,因为我也希望能够使用printf等等.所以问题是打印任何不同的方式(鉴于上面列出的情况),如果是这样,第二个方法有任何优势吗?
编辑2:按照下面的评论,我现在知道这个程序有效 - 我认为这是不可能的:
int main()
{
setlocale(LC_ALL, "");
wprintf(L"? ??????????? ?? ???? ?????\n"); // wide output
freopen(NULL, "w", stdout); // lets me switch
printf("? ??????????? ?? ???? ?????\n"); // byte output
}
Run Code Online (Sandbox Code Playgroud)
EDIT3:我通过观察这两种类型的情况做了一些进一步的研究.拿一个更简单的字符串:
wchar_t *wides = L"£100 ?";
char *mbs = "£100 ?";
Run Code Online (Sandbox Code Playgroud)
编译器生成不同的代码.宽字符串是:
.string "\243"
.string ""
.string ""
.string "1"
.string ""
.string ""
.string "0"
.string ""
.string ""
.string …Run Code Online (Sandbox Code Playgroud) 我想设置一个函数,它相当于标记整个缓冲区,并运行C-u M-|以提示命令,将缓冲区传递给命令并用输出替换缓冲区.然后可能将它设置为shift-f5或其他东西.
我只有这个:
(defun shell-command-on-buffer ()
(interactive)
(mark-whole-buffer))
Run Code Online (Sandbox Code Playgroud)
我该怎么办呢?
我只是想用来crypt()生成一个加密的密码,我写了一个调用该crypt()方法的demo .这是我的代码
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("%s\n",crypt("abc","ab"));
exit(0);
}
Run Code Online (Sandbox Code Playgroud)
我使用它编译它"gcc tem.c -lcrypt',当我运行它时,一切似乎都正确,但出现"段错误".请告诉我这个简单的程序有什么问题?
我正在链接一个外部库(通过wierd进程,mpicc + Cython +等),但我有一个奇怪的链接过程行为.
有两个.o文件,libpetsc4py.o和PETSc.o它们被链接到一个.so文件PETSc.so
一个包含一个未定义的符号 __pyx_tp_new_8petsc4py_5PETSc_Object
[zheltkov@compiler-2 src]$ nm libpetsc4py.o | grep __pyx_tp_new_8petsc4py_5PETSc_Object
U __pyx_tp_new_8petsc4py_5PETSc_Object
Run Code Online (Sandbox Code Playgroud)
它在另一个.o文件中定义:
[zheltkov@compiler-2 src]$ nm PETSc.o | grep __pyx_tp_new_8petsc4py_5PETSc_Object
00000000001b92f0 t __pyx_tp_new_8petsc4py_5PETSc_Object
Run Code Online (Sandbox Code Playgroud)
然后,完成链接(编译行很奇怪,对不起)
mpicc -pthread -fPIC -wd1572 -g -shared -fno-strict-aliasing -g -O2 -DNDEBUG -O2 -g
build/temp.linux-x86_64-2.7/arch-linux2-c-debug/src/PETSc.o build/temp.linux-x86_64-
2.7/arch- linux2-c-debug/src/libpetsc4py.o -L/home/users/zheltkov/tmp/petsc-3.3/arch
-linux2-c-debug/lib -L/home/users/zheltkov/ivan/soft/epd7.2/lib
-Wl,rpath,/home/users/zheltkov/tmp/petsc-3.3/arch-linux2-c-debug/lib
-Wl,-rpath,/home/users/zheltkov/ivan/soft/epd7.2/lib -lpetsc -lpython2.7 -o
build/lib.linux-x86_64-2.7/petsc4py/lib/a rch-linux2-c-debug/PETSc.so -lX11 -Wl,
-rpath,/home/users/zheltkov/tmp/petsc-3.3/arch-linux2-c-debug/lib
-L/home/users/zheltkov/tmp/petsc-3.3/arch-linux2-c-debug/lib -lfftw3_mpi -lfftw3 -lHYPRE
-Wl,-rpath,/opt/intel/impi/4.1.0.030/intel64/lib
-L/opt/intel/impi/4.1.0.030/intel64/lib -Wl,
-rpath,/opt/intel/composer_xe_2013.2.146/mkl/lib/intel64
-L/opt/intel/composer_xe_2013.2.146/mkl/lib/intel64
-Wl,-rpath,/opt/intel/composer_xe_2013.2.146/compiler/lib/intel64
-L/opt/intel/composer_xe_2013.2.146/compiler/lib/intel64 -Wl,
-rpath,/usr/lib/gcc/x86_64-redhat-linux/4.4.6 -L/usr/lib/gcc/x86_64-redhat-linux/4.4.6
-Wl,- rpath,/mnt/data/users/dm4/vol9/zheltkov/tmp/petsc-3.3/-Xlinker -lmpigc4
-Wl,-rpath,/opt/intel/mpi-rt/4.1 -lml -lpthread -Wl,-rpath,
/opt/intel/composer_xe_2013/mkl/lib/intel64
-L/opt/intel/composer_xe_2013/mkl/lib/intel64 …Run Code Online (Sandbox Code Playgroud) 许多文本都警告说,将char值作为整数处理是不可移植的,例如,假设'A'的值为65(如ASCII中所示).
但是什么决定了这个字符集是ASCII(或扩展形式)还是其他一些字符集?它是由操作系统还是编译器决定的?我假设这不依赖于硬件.
例如,英特尔PC是否有一个字符集,如EBCDIC(理论上)?并且可以LANG在Linux/Unix中更改环境变量来更改C程序的基本字符集的值(如果再重新编译)?
(编辑:我现在看到Linux中的各种非拉丁字符集都有相同的基本ASCII码,例如KOI8-U - 我假设有些字符集与ASCII不兼容的变体)
我有一个文件描述符设置为正值与open()函数的结果,所以这个fd指示一个文件.当我删除实际文件时,fd仍然是一个正整数.我想知道如果由于某种原因删除文件,我怎么知道这个文件描述符不再有效.简而言之,我怎么知道fd指示的文件,仍然存在与否.我想在FreeBSD上用C做这个.
在C99,我对这里的差异感到有点困惑:
int myfunc (int array[n], int n) { ... }
Run Code Online (Sandbox Code Playgroud)
不会编译.据我所知,你必须首先将引用放在数组大小,所以必须写入:
int myfunc (int n, int array[n]) { ... }
Run Code Online (Sandbox Code Playgroud)
但是如果你提供static关键字,这绝对可以:
int myfunc (int array[static 1], int n) { ... }
Run Code Online (Sandbox Code Playgroud)
这个顺序对我来说是优选的,因为我习惯于在函数调用中使用数组,但为什么这可能呢?
编辑:意识到第三个例子实际上不是VLA有帮助......
作为参考,这是我正在研究的一段代码导致了这个问题:
int sum_array(int n, int m, int a[n][m])
{
int i, j, sum = 0;
for (i = 0; i < n; i++)
for (j = 0; j < m; j++)
sum += a[i][j];
return sum;
}
Run Code Online (Sandbox Code Playgroud) 我正在将程序编译为汇编代码,特别是 32 位形式,当我在没有 -m32 标志的情况下进行编译时,如下所示......:
gcc -S examples.c
Run Code Online (Sandbox Code Playgroud)
它编译得很好。然而当我这样做时...
gcc -S -m32 examples.c
Run Code Online (Sandbox Code Playgroud)
我的 include stdlib.h (由于它没有显示在预览窗口中,所以格式被删除)行出现错误,如下所示:
In file included from /usr/include/stdlib.h:25:0,
from examples.c:1:
/usr/include/features.h:324:26: fatal error: bits/predefs.h: No such file or directory
compilation terminated.
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?
从 C 标准中可以清楚地看出,通用函数调用是定义中的表达式:
表达式是一系列运算符和操作数,用于指定值的计算,或指定对象或函数,或产生副作用,或执行其组合。运算符的操作数的值计算在运算符的结果的值计算之前进行排序。(6.5.1)
由于()are 运算符并返回一个值,因此常规函数调用显然是表达式。
但是那些不返回值的似乎不符合这个定义。函数名本身确实如此(因为它指定了一个函数),但这不是函数调用。
该标准确实明确说明函数调用是一个表达式,并且它可以返回void,但这似乎与表达式的定义相冲突。我错过了什么?
我一直在努力养成在他们需要的时候定义琐碎变量的习惯.我一直对编写这样的代码持谨慎态度:
while (n < 10000) {
int x = foo();
[...]
}
Run Code Online (Sandbox Code Playgroud)
我知道标准是绝对清楚的,x只存在于循环内部,但这在技术上是否意味着整数将在每次迭代时在堆栈上分配和解除分配?我意识到优化编译器不太可能这样做,但它保证了吗?
例如,写作是否更好:
int x;
while (n < 10000) {
x = foo();
[...]
}
Run Code Online (Sandbox Code Playgroud)
我不是故意用这个代码,而是在任何类似的循环中.
我用gcc 4.7.2快速测试了一个简单的循环,这种方式不同并生成了相同的组件,但我的问题是这两个,根据标准,相同吗?
在Fedora 18中,我写了一个文件"ac",如下所示:
#include <stdio.h>
void main(void)
{
printf("a");
}
Run Code Online (Sandbox Code Playgroud)
然后我用gcc 4.7.2编译它:gcc a.c -o a
最后使用ldd 2.16:ldd -u ./a
输出很奇怪:
Unused direct dependencies:
/lib64/libc.so.6
我认为目标文件真的/lib64/libc.so.6是因为使用printf().在Red Hat 6中,
没有这种奇怪的外观.
两者都声明并启动一个长整数?
我希望对于这个论坛来说这不是一个基本的问题.我想知道上述两个语句是否实现了同样的事情,即声明一个长整数变量num并将其初始化为24.谢谢.