许多程序中的常见任务是将字节数(例如来自驱动器容量或文件大小)转换为更易于阅读的形式.将150000000000个字节视为"150 GB"或"139.7 GiB"更易读.
是否有任何库包含执行这些转换的功能?在Python?在C?在伪代码?是否有关于"最易读"形式的最佳实践,例如重要字符数,精度等?
这是我的第一篇文章,所以如果我太模糊或提供每个人都会直观地假设的信息,请告诉我.
我很擅长用C语写作,我只是想更好地理解预处理.我正在编写一个简单的程序,可以直接从控制台使用gcc -Wall -std=c99 -DSEED=argument参数,我的参数应该是一个整数,或者如果-D没有定义,用户将输入它.
SEED值仅用于srand().我很困惑,为什么我的代码不能编译,如果我输入一个-DSEED=a作为我的参数,而如果我把-DSEED=1它编译.我得到了一个"未声明的(在这个函数中首次使用)"错误并且真的不明白两者之间的区别.我认为#define变量类型与输入匹配,所以如果我输入"a"#SEED将是一个char,如果我输入"1"#SEED将是一个int.
如果未定义SEED,我正在使用#ifndef SEED命令,这很有效.我想我应该"输入"输入SEED,然后检查它是否是整数.在线阅读一些文章之后我正在尝试使用:
#ifndef SEED
//code
#else
#define TO_STRING( input ) #input
char c;
c = TO_STRING( SEED )
//Then I was going to use c to figure out if it was an int.
#endif
Run Code Online (Sandbox Code Playgroud)
这是行不通的,任何能够指出你认为我可能有任何误解的人都会非常感激.
编辑 - 所以我确实弄清楚为什么我在尝试时收到错误消息-DSEED=a,因为它是将其作为变量读取.
所以我想做传统的事情来处理宏中的字符串化运算符:
#define FOO(x) foo(#x, (x))
Run Code Online (Sandbox Code Playgroud)
但是我需要使用字符串文字前缀:http://en.cppreference.com/w/cpp/language/string_literal
这是一个问题,因为如果我需要一个UTF-32字符串文字我尝试这样做:
#define FOO(x) foo(U#x, (x))
Run Code Online (Sandbox Code Playgroud)
但gcc 4.9.2抱怨:
错误:在此范围内未声明'U'
有没有办法让编译器将其U作为字符串化宏变量的前缀?
我正在运行perl,为sun4-solaris-64int构建的v5.6.1
我在数组上调用print:
print "@vals\n";
Run Code Online (Sandbox Code Playgroud)
输出看起来像:
HASH(0x229a4) uid cn attuid
Run Code Online (Sandbox Code Playgroud)
或者另一个例子:
@foo = {};
push(@foo, "c");
print "@foo I am done now\n";
Run Code Online (Sandbox Code Playgroud)
输出:
HASH(0x2ece0) c I am done now
Run Code Online (Sandbox Code Playgroud)
HASH(0x2ece0)来自哪里?
我正在看一些开源项目,我看到以下内容:
NSLog(@"%s w=%f, h=%f", #size, size.width, size.height)
Run Code Online (Sandbox Code Playgroud)
在尺寸符号之前,'#'究竟是什么意思?这是C字符串的某种前缀吗?
cocoa cocoa-touch objective-c stringification c-preprocessor
我正在尝试做一些概念上与此相似的事情,但似乎无法让它发挥作用(最后显示的错误)任何想法?
#include <stdio.h>
int main( int argc , char const *argv[] )
{
int abc_def_ghi = 42;
#define SUFFIX ghi
#define VAR(prefix) prefix##_def_##SUFFIX
printf( "%d\n" , VAR(abc) );
return 0;
}
// untitled:8: error: ‘abc_def_SUFFIX’ undeclared (first use in this function)
Run Code Online (Sandbox Code Playgroud) 我面临一个棘手的问题.我想根据编译器命令行伪造一个C源文件内容.例如(使用VC):
如果我使用命令行
cl -c -E -Dfoo=rice test.c
Run Code Online (Sandbox Code Playgroud)
我希望得到实际的 C内容(在预处理之后):
char *s = "rice";
Run Code Online (Sandbox Code Playgroud)
如果我使用命令行
cl -c -E -Dfoo=ball test.c
Run Code Online (Sandbox Code Playgroud)
我希望得到实际的C源文件内容:
char *s = "ball";
Run Code Online (Sandbox Code Playgroud)
现在找到解决方案......
第一次尝试:
// test.c
#define STRNAME(n) #n
char *s = STRNAME(foo);
Run Code Online (Sandbox Code Playgroud)
- 没运气.无论foo被定义为命令行,我总是得到
char *s = "foo"; // Oh no!
Run Code Online (Sandbox Code Playgroud)
第二次尝试(最接近我可以拍照,但仍然很详细):
// test.c
#define STRNAME(n) #n
char *s = foo;
Run Code Online (Sandbox Code Playgroud)
这次,我必须详细更改命令行:
cl -c -E -Dfoo=STRNAME(rice) test.c
Run Code Online (Sandbox Code Playgroud)
现在我明白了
char *s = "rice";
Run Code Online (Sandbox Code Playgroud)
有没有办法帮助我摆脱这种冗长?
顺便说一句:我真的不喜欢在命令参数中引入引号(让它们成为其中的一部分argv[x],因为你无法在Windows CMD和Linux Bash上可靠且可移植地编写这样的命令行 - 我想.
我正在尝试将宏的参数字符串化,以便它将提供unicode字符串,即我想要获得以下内容:
WIDEN(4>5) L"4>5"
Run Code Online (Sandbox Code Playgroud)
我的宏是这样的:
#define WIDEN(x) L #x
Run Code Online (Sandbox Code Playgroud)
不幸的是不起作用.这该怎么做?
我想在compile命令中传递一个版本字符串:
$ g++ -Wall -D VERSION="2013-12-03 02:15:21, commit cb060df" -o main main.cpp
Run Code Online (Sandbox Code Playgroud)
在我的代码中,我有以下内容:
#define TOSTR_(x) #x
#define STRINGIFY(x) TOSTR_(x)
#define VERSION_STR STRINGIFY(VERSION)
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为VERSION宏中有一个逗号,所以看起来我传递了两个参数TOSTR()(显然,VERSION宏只有在STRINGIFY()作为一个唯一参数传递后才会被扩展).
我在这里找到的以下方法也不起作用:
#define CONCAT(...) __VA_ARGS__
#define TOSTR_(x) #x
#define STRINGIFY(x) TOSTR_(CONCAT(x))
#define VERSION_STR STRINGIFY(VERSION)
Run Code Online (Sandbox Code Playgroud)
因为这似乎是相同的
#define VERSIONSTR "CONCAT(2013-12-03 02:15:21, commit cb060df)"
Run Code Online (Sandbox Code Playgroud)
也就是说,宏CONCAT()不会扩展.
注1:我宁愿不在命令行中传递一个C字符串,因为版本字符串实际上是动态生成的,它可能包含一些引号.这意味着只写g++ -D VERSION=\""$(GENERATED_STRING)"\"而不是对传递的参数进行字符串化是行不通的.
注2:如果有人在没有任何预处理器宏的情况下找到了这样做的方法,我会非常高兴.
#include<stdio.h>
#define DEF6 625
#define DEF6 625
#define DEF(n) DEF##n
void main(){
printf("%d\n", DEF(6));
}
Run Code Online (Sandbox Code Playgroud)
这段代码有效.但
#include<stdio.h>
#define DEF6 625
#define DEF(n) DEF##n
void main(){
int a=6;
printf("%d\n", DEF(a));
}
Run Code Online (Sandbox Code Playgroud)
此代码不起作用.错误结果是这样的
第8行:错误:'DEFa'未声明(在此函数中首次使用)
第8行:错误:(每个未声明的标识符仅报告一次
第8行:错误:对于它出现的每个函数.)
那么如何将Integer类型变量添加到#define使用中##呢?
stringification ×10
c ×5
macros ×3
c++ ×1
cocoa ×1
cocoa-touch ×1
objective-c ×1
perl ×1
python ×1
readability ×1
reference ×1
token ×1