标签: stringification

将数据量/容量格式化为字符串

许多程序中的常见任务是将字节数(例如来自驱动器容量或文件大小)转换为更易于阅读的形式.将150000000000个字节视为"150 GB"或"139.7 GiB"更易读.

是否有任何库包含执行这些转换的功能?在Python?在C?在伪代码?是否有关于"最易读"形式的最佳实践,例如重要字符数,精度等?

c python readability stringification

3
推荐指数
1
解决办法
359
查看次数

Stringify 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,因为它是将其作为变量读取.

c stringification c-preprocessor

3
推荐指数
1
解决办法
2469
查看次数

预处理器使用字符串文字前缀对运算符进行字符串化

所以我想做传统的事情来处理宏中的字符串化运算符:

#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作为字符串化宏变量的前缀?

macros string-literals stringification c-preprocessor

3
推荐指数
1
解决办法
681
查看次数

为什么我的Perl输出中会看到HASH(0xABCDEF)?

我正在运行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)来自哪里?

perl reference stringification

2
推荐指数
2
解决办法
491
查看次数

Mac OSX/iPhone上的C预处理器,使用'#'键?

我正在看一些开源项目,我看到以下内容:

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

2
推荐指数
1
解决办法
1204
查看次数

C编程:预处理器,宏作为标记

我正在尝试做一些概念上与此相似的事情,但似乎无法让它发挥作用(最后显示的错误)任何想法?

#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 macros token stringification c-preprocessor

2
推荐指数
2
解决办法
3358
查看次数

如何从cmd行创建-D值成为字符串?

我面临一个棘手的问题.我想根据编译器命令行伪造一个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上可靠且可移植地编写这样的命令行 - 我想.

c stringification c-preprocessor

2
推荐指数
1
解决办法
205
查看次数

将宏的参数字符串化为unicode

我正在尝试将宏的参数字符串化,以便它将提供unicode字符串,即我想要获得以下内容:

WIDEN(4>5)  L"4>5"
Run Code Online (Sandbox Code Playgroud)

我的宏是这样的:

#define WIDEN(x) L #x
Run Code Online (Sandbox Code Playgroud)

不幸的是不起作用.这该怎么做?

macros string-literals stringification c-preprocessor

2
推荐指数
1
解决办法
374
查看次数

如何对包含逗号的字符串进行字符串化?

我想在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:如果有人在没有任何预处理器宏的情况下找到了这样做的方法,我会非常高兴.

c++ stringification c-preprocessor variadic-macros

2
推荐指数
1
解决办法
2226
查看次数

如何在C预处理器中使用'##'添加Integer?

#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使用中##呢?

c stringification c-preprocessor

2
推荐指数
1
解决办法
56
查看次数